import pandas as pd
from pathlib import Path


def detect_diagram_type(sheet_name: str) -> str:
    if "평일" in sheet_name:
        return "weekday"
    elif "토요일" in sheet_name:
        return "saturday"
    elif "휴일" in sheet_name:
        return "holiday"
    else:
        return None


def convert_sheet(df: pd.DataFrame, diagram_type: str) -> pd.DataFrame:
    """
    열번 기준 시각표 변환 (상/하행 혼합 구조 대응)
    """

    # 첫 행을 헤더로 설정
    df.columns = df.iloc[0]
    df = df.drop(index=0).reset_index(drop=True)

    # 열차번호 컬럼명 통일
    df = df.rename(columns={df.columns[0]: "train_number"})

    # 역 컬럼 목록
    stations = list(df.columns[1:])

    # 열차번호 숫자 변환
    df["train_number"] = pd.to_numeric(df["train_number"], errors="coerce")

    # 시간 없는 열차 제거
    df = df.dropna(subset=stations, how="all")

    # 필요한 컬럼만 유지
    df = df[["train_number"] + stations]

    # 세로형 변환
    long_df = df.melt(
        id_vars=["train_number"],
        value_vars=stations,
        var_name="station",
        value_name="time"
    )

    # 시간 없는 행 제거
    long_df = long_df.dropna(subset=["time"])

    # 시간 문자열 통일
    long_df["time"] = pd.to_datetime(
        long_df["time"], errors="coerce"
    ).dt.strftime("%H:%M:%S")

    long_df = long_df.dropna(subset=["time"])

    # 순번 생성 (역 순서 그대로 사용)
    station_order = {station: i + 1 for i, station in enumerate(stations)}
    long_df["seq"] = long_df["station"].map(station_order)

    # 다이어 타입
    long_df["diagram_type"] = diagram_type

    return long_df.sort_values(["train_number", "seq"])


def convert_excel_to_parquet(xlsx_path: str, output_dir: str):
    xls = pd.ExcelFile(xlsx_path)
    all_data = []

    for sheet in xls.sheet_names:
        diagram_type = detect_diagram_type(sheet)
        if diagram_type is None:
            continue

        print(f"처리중: {sheet} → {diagram_type}")
        df = pd.read_excel(xls, sheet_name=sheet)
        converted = convert_sheet(df, diagram_type)
        all_data.append(converted)

    if not all_data:
        raise ValueError("변환할 시트를 찾지 못했습니다.")

    final_df = pd.concat(all_data, ignore_index=True)

    output_path = Path(output_dir)
    output_path.mkdir(parents=True, exist_ok=True)

    # partition 저장
    final_df.to_parquet(
        output_path,
        index=False,
        partition_cols=["diagram_type"]
    )

    print("\n변환 완료")
    print(f"저장 위치: {output_path}")
    print(final_df.head())


if __name__ == "__main__":
    convert_excel_to_parquet(
        xlsx_path="timetable.xlsx",
        output_dir="timetable_parquet"
    )
