"""Lee el Excel de Tramitación LME. La planilla trae Folio y RUT (obligatorios);
el tipo de contrato, días e imponible salen de las liquidaciones cargadas del
MISMO RUT. La entidad de salud (FONASA / nombre de la isapre) se lee de la
planilla si viene ("Entidad de Salud"); si no, se usa la de la liquidación.

Encabezados aceptados (tolerante a acentos/mayúsculas/typos):
  Folio / N° Licencia / Folio Licencia  (se conserva CON dígito verificador)
  RUT / RUN
  Entidad de Salud  (opcional; FONASA o el nombre de la isapre)
"""
import unicodedata
import openpyxl
from config import rut_valido


def _norm(s):
    s = str(s or "").strip().lower()
    s = unicodedata.normalize("NFD", s)
    s = "".join(c for c in s if unicodedata.category(c) != "Mn")
    s = " ".join("".join(c if c.isalnum() else " " for c in s).split())
    out = []
    for c in s:              # colapsa letras repetidas (tolera typos)
        if not out or out[-1] != c:
            out.append(c)
    return "".join(out)


def _mapear(h):
    n = _norm(h)
    if not n:
        return None
    if "entidad" in n and "salud" in n:   return "entidad_salud"
    if "folio" in n or "licencia" in n:   return "folio"
    if "rut" in n or "run" in n:          return "rut"
    return None


def _fmt(v):
    if v is None:
        return ""
    if isinstance(v, float) and v.is_integer():
        return str(int(v))
    return str(v).strip()


def leer_tramitaciones(ruta):
    wb = openpyxl.load_workbook(ruta, data_only=True)
    ws = wb.active
    filas = list(ws.iter_rows(values_only=True))
    if not filas:
        return []
    encabezados = list(filas[0])
    idx = {}
    for i, h in enumerate(encabezados):
        clave = _mapear(h)
        if clave and clave not in idx:
            idx[clave] = i

    faltan = [k for k in ("folio", "rut") if k not in idx]
    if faltan:
        raise ValueError(
            f"El Excel no tiene las columnas obligatorias. Faltan: {faltan}\n"
            f"Encabezados encontrados: {[_fmt(h) for h in encabezados]}")

    registros = []
    for n, fila in enumerate(filas[1:], start=2):
        if fila is None or all(c is None or str(c).strip() == "" for c in fila):
            continue
        # Folio se conserva TAL CUAL (con dígito verificador; el portal lo pide así)
        folio = _fmt(fila[idx["folio"]]) if idx["folio"] < len(fila) else ""
        rut = _fmt(fila[idx["rut"]]) if idx["rut"] < len(fila) else ""
        entidad_salud = ""
        if "entidad_salud" in idx and idx["entidad_salud"] < len(fila):
            entidad_salud = _fmt(fila[idx["entidad_salud"]])
        reg = {"_fila_excel": n, "folio": folio, "rut": rut, "entidad_salud": entidad_salud}
        reg["rut_valido"] = rut_valido(rut)
        avisos = []
        if not folio:
            avisos.append("Falta el Folio")
        if not reg["rut_valido"]:
            avisos.append("RUT inválido")
        reg["avisos"] = avisos
        registros.append(reg)
    return registros


if __name__ == "__main__":
    import sys
    for r in leer_tramitaciones(sys.argv[1]):
        print(r)
