#!/usr/bin/env python3
"""
FASE 2b: estrae dai .docx gli elementi di valutazione, leggendo ENTRAMBE le
tabelle (T10 cap.1 + T11 cap.2-8) che l'import di allora leggeva solo a metà.
Usa il nome elemento come ancora (processa solo righe il cui primo campo è un
elemento del master), così salta righe-capitolo e header. Non tocca il DB.

  python3 import-tools/scripts/fix_docx_valutazione.py <master_elementi.json> > out.json
"""
import sys, os, re, json, glob
from docx import Document

DVR_DIR = os.path.join(os.path.dirname(__file__), "..", "..", "-mat", "DVR")


def norm(s):
    if s is None:
        return None
    s = re.sub(r"[ \t\r\n]+", " ", str(s)).strip()
    return s or None


def key(s):
    # normalizzazione per il matching: minuscolo, spazi compressi, no punteggiatura ai bordi
    return re.sub(r"\s+", " ", (s or "").lower()).strip().strip(".:;")


def to_int(v):
    v = norm(v)
    if v is None:
        return None
    try:
        n = int(v)
        return n if 0 <= n <= 9 else None
    except ValueError:
        return None


def estrai(doc, master_key2id):
    seen = set()
    out = []
    for t in doc.tables:
        for row in t.rows:
            cells = [norm(c.text) for c in row.cells]
            if not cells or not cells[0]:
                continue
            elem_id = master_key2id.get(key(cells[0]))
            if elem_id is None or elem_id in seen:
                continue
            seen.add(elem_id)
            g = lambda i: cells[i] if i < len(cells) else None
            out.append({
                "elemento_id": elem_id,
                "elemento": cells[0],
                "figure_esposte": g(2),
                "rischi_descr": g(3),
                "misure_prevenzione": g(4),
                "p": to_int(g(6)),
                "g": to_int(g(7)),
                "misure_h": norm(cells[-1]) if len(cells) > 8 else None,
            })
    return out


def main():
    master = json.load(open(sys.argv[1], encoding="utf-8"))  # nome -> id
    m = {key(k): v for k, v in master.items()}
    files = sorted(glob.glob(os.path.join(DVR_DIR, "*.docx")))
    result = {}
    err = 0
    for f in files:
        name = os.path.basename(f)
        try:
            result[name] = estrai(Document(f), m)
        except Exception as e:
            err += 1
            sys.stderr.write(f"ERRORE {name}: {e}\n")
    sys.stderr.write(f"Elaborati {len(result)} docx, {err} errori.\n")
    json.dump(result, sys.stdout, ensure_ascii=False)


if __name__ == "__main__":
    main()
