import csv
from io import StringIO
from typing import Dict, List, Set

SUPPORTED_FORMATS = {"csv"}


def read_tabular_file(file_bytes: bytes, filename: str) -> List[Dict[str, str]]:
    extension = filename.lower().split(".")[-1]
    if extension not in SUPPORTED_FORMATS:
        raise ValueError("Format non supporté pour ce MVP serveur. Utiliser csv.")

    text = file_bytes.decode("utf-8-sig")
    reader = csv.DictReader(StringIO(text))
    return [dict(row) for row in reader]


def records_to_csv_bytes(records: List[Dict]) -> bytes:
    if not records:
        return b""

    output = StringIO()
    fieldnames = list(records[0].keys())
    writer = csv.DictWriter(output, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(records)
    return output.getvalue().encode("utf-8")


def validate_required_columns(records: List[Dict], required_columns: Set[str]) -> None:
    if not records:
        raise ValueError("Fichier vide ou sans données.")

    columns = set(records[0].keys())
    missing = required_columns - columns
    if missing:
        raise ValueError(f"Colonnes manquantes: {', '.join(sorted(missing))}")
