"""Extrait de l'Excel « EVENT TRACKER » les données de reprise de l'ERP.

Usage : python3 scripts/extraire_excel.py "docs/reference/EVENT TRACKER CHAYMAA.xlsx"
Produit prisma/data/procedure.json (modèle de procédure) et prisma/data/dossiers.json (registre).
"""
import json
import re
import sys
from pathlib import Path

import openpyxl

SECTIONS = [
    (11, "A", "Ouverture du dossier"),
    (27, "B", "Qualification, étude du brief et repérage"),
    (52, "C", "Conception et proposition commerciale"),
    (68, "D", "Planification opérationnelle"),
    (118, "E", "Exploitation"),
    (144, "F", "Évaluation et pré-clôture"),
    (159, "G", "Clôture et archivage"),
]

ANCRES = [
    (r"^RECP|^R\b|^R\+", "RECEPTION"),
    (r"^REP[EÉ]RAGE", "REPERAGE"),
    (r"^CONF", "CONFIRMATION"),
    (r"^EVENT", "EVENEMENT"),
    (r"^P\+", "PERTE"),
    (r"SAMEDI", "HEBDO"),
]


# Rôles saisis librement dans l'Excel (« PALNIF », « CHA MISS », « DIRT TECH »…) → libellé normalisé.
ROLES = [
    (r"\bDIR\w*\s*TE\w*|\bDIRET\b", "DIR. TECHNIQUE"),
    (r"\b(CHA|CAR|CHAR|HAR|CHARGE)\w*\s*(G\s*)?(DE\s*)?MIS\w*", "CHARGÉ DE MISSION"),
    (r"\bSALES\s*COOR\w*", "COORD. COMMERCIAL"),
    (r"\bSALES\b", "COMMERCIAL"),
    (r"\bP(LA|AL)N?\w*|\bPLAF\b", "PLANIFICATION"),
    (r"\bSTOCK\b", "STOCK"),
    (r"\bSTUDIO\b", "STUDIO"),
    (r"\bTOP\b", "DIRECTION"),
    (r"\bASS\w*", "ASSISTANTE"),
    (r"\bCC\b", "CC"),
    (r"\bATL\b", "ATL"),
    (r"\bAT\b", "AT"),
    (r"\bED\b", "ED"),
    (r"\bMC\b", "MC"),
    (r"\b3\s*D\w*", "3D"),
    (r"\bPHOTOG\w*", "PHOTOGRAPHE"),
    (r"\bCHAUFFEUR\w*", "CHAUFFEURS"),
    (r"\bOP\b", "OP"),
    (r"\bSAFIA\b", "SAFIA"),
    (r"\bZAHWA\b", "ZAHWA"),
]


def normaliser_responsable(brut):
    texte = " ".join(str(brut or "").upper().split())
    trouves = []
    for motif, role in ROLES:
        for m in re.finditer(motif, texte):
            trouves.append((m.start(), role))
            texte = texte[: m.start()] + " " * (m.end() - m.start()) + texte[m.end():]
    roles = []
    for _, role in sorted(trouves):
        if role not in roles:
            roles.append(role)
    return " / ".join(roles) or "À DÉFINIR"


def propre(v):
    return " ".join(str(v).split()) if v is not None else ""


def echeance(brut):
    """'Recp+2 Repérage +3' -> (ancre, décalage, ancre de repli, décalage de repli)."""
    morceaux = [m.strip() for m in str(brut or "").upper().split("\n") if m.strip()]
    res = []
    for m in morceaux:
        for motif, ancre in ANCRES:
            if re.search(motif, m):
                nb = re.search(r"([+-])\s*(\d+)", m)
                dec = int(nb.group(2)) * (-1 if nb.group(1) == "-" else 1) if nb else 0
                if ancre == "HEBDO":
                    dec = 0
                res.append((ancre, dec))
                break
    # Si le repérage est cité, il prime ; la réception sert de repli.
    res.sort(key=lambda r: 0 if r[0] == "REPERAGE" else 1)
    principal = res[0] if res else (None, 0)
    repli = res[1] if len(res) > 1 else (None, 0)
    return principal[0], principal[1], repli[0], repli[1]


def section(col):
    s = None
    for debut, code, nom in SECTIONS:
        if col >= debut:
            s = (code, nom)
    return s


def main(chemin):
    wb = openpyxl.load_workbook(chemin, data_only=True)
    ws = wb["TRACKER "]
    etapes = []
    for col in range(11, 163):
        libelle = propre(ws.cell(1, col).value)
        # Séparateurs de section (« B », « C »…) et colonne de remarques sans numéro.
        if len(libelle) <= 2 or ws.cell(2, col).value is None:
            continue
        code, nom = section(col)
        ancre, dec, ancre2, dec2 = echeance(ws.cell(3, col).value)
        etapes.append({
            "numero": ws.cell(2, col).value,
            "section": code,
            "sectionNom": nom,
            "libelle": libelle,
            "echeanceBrute": propre(ws.cell(3, col).value),
            "ancre": ancre,
            "decalage": dec,
            "ancreRepli": ancre2,
            "decalageRepli": dec2,
            "responsable": normaliser_responsable(ws.cell(4, col).value),
            "responsableExcel": propre(ws.cell(4, col).value),
        })

    ws = wb["TABLEAU "]
    dossiers = []
    # Les dossiers les plus récents sont parfois saisis au-dessus de la ligne « ETAPES » (ligne 4).
    for r in range(2, ws.max_row + 1):
        num = ws.cell(r, 3).value
        if not isinstance(num, (int, float)):
            continue
        dossiers.append({
            "societe": propre(ws.cell(r, 2).value),
            "numero": int(num),
            "client": propre(ws.cell(r, 4).value),
            "intitule": propre(ws.cell(r, 5).value),
            "statutExcel": propre(ws.cell(r, 7).value),
        })

    sortie = Path(__file__).resolve().parent.parent / "prisma" / "data"
    sortie.mkdir(parents=True, exist_ok=True)
    (sortie / "procedure.json").write_text(json.dumps(etapes, ensure_ascii=False, indent=1))
    (sortie / "dossiers.json").write_text(json.dumps(dossiers, ensure_ascii=False, indent=1))
    print(f"{len(etapes)} étapes, {len(dossiers)} dossiers")


if __name__ == "__main__":
    main(sys.argv[1])
