#!/usr/bin/env python3
"""Convertit le BLOC 2 (briques méthodo) de templates.xlsx → JSON pour app:bricks:import.

Structure de la feuille « CHIFFRAGE V1 » (bloc briques, après l'en-tête D='TJM 1', E='TJM 2') :
  A = n° de brique · B = nom de la brique · C = tâche · D/E = charge TJM1/TJM2 · B='Livrable' → livrable.

Règles :
  - A numérique non vide  → NOUVELLE brique (name = B) ; si C présent → 1ʳᵉ tâche = C,
    sinon si D/E présents → 1ʳᵉ tâche = B ;
  - B == 'Livrable'       → livrable de la brique courante (texte en C) ;
  - C seul                → tâche de la brique courante (name = C) ;
  - B seul (hors Livrable) → tâche de la brique courante (name = B).
Les profils recommandés sont ['TJM 1', 'TJM 2'] (génériques, sans TJM).
N'ÉCRIT RIEN EN BASE.
"""
import json, sys, re
sys.path.insert(0, "scripts")
import dump_xlsx as dx
import zipfile
from xml.etree import ElementTree as ET
NS = dx.NS
SHEET = "CHIFFRAGE V1"
PROFILES = ["TJM 1", "TJM 2"]


def sheet_rows(z, target, shared):
    sx = ET.fromstring(z.read(target))
    sd = sx.find(f"{NS}sheetData")
    rows = []
    for row in sd.findall(f"{NS}row"):
        cells = {}
        for c in row.findall(f"{NS}c"):
            ref = c.get("r", ""); t = c.get("t")
            v = c.find(f"{NS}v"); inline = c.find(f"{NS}is")
            if t == "s" and v is not None and v.text is not None:
                val = shared[int(v.text)]
            elif t == "inlineStr" and inline is not None:
                val = "".join(x.text or "" for x in inline.iter(f"{NS}t"))
            elif v is not None:
                val = v.text
            else:
                val = None
            if val is not None and str(val).strip() != "":
                cells[dx.col_letter(ref)] = str(val).strip()
        rows.append(cells)
    return rows


def num(v):
    try:
        return round(float(str(v).strip().replace(",", ".")), 4)
    except (ValueError, TypeError, AttributeError):
        return 0.0


def main():
    z = zipfile.ZipFile(sys.argv[1])
    shared = dx.load_shared_strings(z)
    target = next((t for n, t in dx.sheet_targets(z) if n == SHEET), None)
    if target is None:
        print(f"Feuille « {SHEET} » introuvable."); sys.exit(1)
    rows = sheet_rows(z, target, shared)

    # Démarre après l'en-tête de la matrice des briques (D == 'TJM 1').
    start = next((i for i, r in enumerate(rows) if r.get("D", "").upper().startswith("TJM 1")), None)
    if start is None:
        print("En-tête TJM 1 introuvable."); sys.exit(1)

    bricks, current = [], None
    for r in rows[start + 1:]:
        a, b, c = r.get("A", ""), r.get("B", ""), r.get("C", "")
        days = [num(r.get("D")), num(r.get("E"))]
        if re.match(r"^\d+$", a) and b:                         # nouvelle brique
            current = {"name": b, "recommendedProfiles": PROFILES, "tasks": [], "deliverables": None}
            bricks.append(current)
            if c:
                current["tasks"].append({"name": c, "days": days})
            elif any(days):
                current["tasks"].append({"name": b, "days": days})
            continue
        if current is None:
            continue
        if b.lower() == "livrable":                             # livrable de la brique
            current["deliverables"] = ((current["deliverables"] + " · ") if current["deliverables"] else "") + (c or "")
            continue
        if c:                                                   # tâche (colonne C)
            current["tasks"].append({"name": c, "days": days})
        elif b:                                                 # tâche nommée en B (sans n°)
            current["tasks"].append({"name": b, "days": days})

    json.dump({"bricks": bricks}, open(sys.argv[2], "w"), ensure_ascii=False, indent=2)
    print(f"{len(bricks)} briques écrites dans {sys.argv[2]}\n")
    print(f"{'BRIQUE':40} {'TÂCHES':6} {'CHARGE':>7}  LIVRABLE")
    for bk in bricks:
        charge = sum(sum(t["days"]) for t in bk["tasks"])
        print(f"{bk['name'][:39]:40} {len(bk['tasks']):<6} {round(charge, 2):>7}  {bk['deliverables'] or ''}")


if __name__ == "__main__":
    main()
