# -*- coding: utf-8 -*-
"""Analyse bidirectionnelle CSV mariage ↔ collection guests."""
import csv
import re
from io import StringIO
from pathlib import Path

GUESTS_DIR = Path(__file__).resolve().parent.parent / "content" / "collections" / "guests"
CSV_PATH = Path(r"c:\Users\yanni\OneDrive\mariage.csv")


def parse_fm(md: str) -> dict:
    if "---" not in md:
        return {}
    fm = md.split("---", 2)[1]
    d = {}
    for line in fm.splitlines():
        if ":" not in line:
            continue
        k, _, v = line.partition(":")
        k = k.strip().lower()
        v = v.strip().strip("'").strip('"')
        if k in ("code", "first_name", "last_name", "title"):
            d[k] = v
    return d


def load_guest_codes():
    out = {}
    for p in GUESTS_DIR.glob("*.md"):
        d = parse_fm(p.read_text(encoding="utf-8"))
        c = d.get("code")
        if not c:
            continue
        fn = d.get("first_name", "")
        ln = d.get("last_name") or d.get("title") or ""
        out[c] = {"file": p.name, "label": f"{fn} {ln}".strip()}
    return out


def read_csv_text():
    raw = CSV_PATH.read_bytes()
    for enc in ("utf-8-sig", "utf-8", "cp1252", "latin-1"):
        try:
            return raw.decode(enc)
        except UnicodeDecodeError:
            continue
    return raw.decode("utf-8", errors="replace")


def csv_code_set_and_rows():
    text = read_csv_text()
    r = csv.reader(StringIO(text), delimiter=";")
    header = next(r)
    idx_n = header.index("Liste de nom")
    idx_c = header.index("Code")
    idx_c2 = header.index("Code 2") if "Code 2" in header else None

    codes = set()
    rows = []
    for row in r:
        while len(row) <= max(idx_c, idx_c2 or idx_c):
            row.append("")
        name = row[idx_n].strip()
        cell_codes = [row[idx_c].strip()]
        if idx_c2 is not None:
            cell_codes.append(row[idx_c2].strip())
        flat = []
        for c in cell_codes:
            if not c:
                continue
            if "|" in c:
                for part in re.split(r"\s*\|\s*", c):
                    if part.strip():
                        flat.append(part.strip())
            else:
                flat.append(c)
        for c in flat:
            codes.add(c)
        rows.append((name, flat))
    return codes, rows, header


def main():
    gc = load_guest_codes()
    csv_codes, rows, _ = csv_code_set_and_rows()

    not_in_guest = sorted(csv_codes - set(gc))
    not_in_csv = sorted(set(gc) - csv_codes)

    print("=== Codes dans le CSV absents de la collection ===")
    for c in not_in_guest:
        print(" ", c)
    print("\n=== Codes dans la collection absents du CSV ===")
    for c in not_in_csv:
        print(" ", c, "->", gc[c])

    # Lignes CSV avec moins de codes que de personnes attendues
    print("\n=== Lignes potentiellement incomplètes (nom seul / vide) ===")
    for name, codes in rows:
        if not name or name.startswith("#"):
            continue
        parts = re.split(r"\s*(?:&|\+|/)\s*|\s+et\s+", re.sub(r"\([^)]*\)", "", name), flags=re.IGNORECASE)
        parts = [p.strip() for p in parts if p.strip()]
        n_people = len(parts)
        n_codes = len(codes)
        if n_people > 1 and n_codes < n_people:
            print(f"  {name!r} -> {n_people} personnes, {n_codes} codes: {codes}")


if __name__ == "__main__":
    main()
