from io import BytesIO

import pandas as pd

SUPPORTED_FORMATS = {"csv", "xlsx", "xls"}


def read_tabular_file(file_bytes: bytes, filename: str) -> pd.DataFrame:
    extension = filename.lower().split(".")[-1]
    if extension not in SUPPORTED_FORMATS:
        raise ValueError("Format non supporté. Utiliser csv, xls ou xlsx.")
    if extension == "csv":
        return pd.read_csv(BytesIO(file_bytes))
    return pd.read_excel(BytesIO(file_bytes))


def dataframe_to_records(df: pd.DataFrame) -> list[dict]:
    df = df.where(pd.notnull(df), None)
    return df.to_dict(orient="records")


def records_to_csv_bytes(records: list[dict]) -> bytes:
    df = pd.DataFrame(records)
    return df.to_csv(index=False).encode("utf-8")


def records_to_xlsx_bytes(records: list[dict]) -> bytes:
    output = BytesIO()
    df = pd.DataFrame(records)
    with pd.ExcelWriter(output, engine="openpyxl") as writer:
        df.to_excel(writer, index=False, sheet_name="export")
    return output.getvalue()


def validate_required_columns(df: pd.DataFrame, required_columns: set[str]) -> None:
    missing = required_columns - set(df.columns)
    if missing:
        raise ValueError(f"Colonnes manquantes: {', '.join(sorted(missing))}")
