"""Lee el Excel de licencias y entrega una lista de diccionarios normalizados."""
from datetime import datetime, date
import openpyxl
from config import rut_valido

# Mapeo: encabezado en el Excel  ->  clave interna
COLUMNAS = {
    "RUN persona trabajadora": "rut",
    "Fecha de Emisión": "fecha_emision",
    "NOMBRE": "nombre",
    "Folio Licencia": "num_licencia",
    "Días Reposo": "dias",
    "Inicio Reposo": "fecha_inicio",
    "Tipo Licencia": "tipo_licencia",
    "RUT PROFESIONAL": "rut_profesional",
    "NOMBRE PROFESIONAL": "nombre_profesional",
    "ESPECIALIDAD": "especialidad",
    "Entidad de Salud": "entidad_salud",
    "Tipo Reposo": "tipo_reposo",
}

# Columnas opcionales (no hacen fallar la lectura si no están)
COLUMNAS_OPCIONALES = {
    "Jornada": "jornada",   # AM/PM, solo se usa cuando el reposo es PARCIAL
}


def _fmt_fecha(v):
    if isinstance(v, (datetime, date)):
        return v.strftime("%d-%m-%Y")
    return str(v).strip() if v is not None else ""


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_licencias(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 = [(_fmt(h) if h is not None else "") for h in filas[0]]
    # índice de cada encabezado conocido
    idx = {}
    for i, h in enumerate(encabezados):
        if h in COLUMNAS:
            idx[COLUMNAS[h]] = i
        elif h in COLUMNAS_OPCIONALES:
            idx[COLUMNAS_OPCIONALES[h]] = i

    faltantes = [k for k in COLUMNAS.values() if k not in idx]
    if faltantes:
        raise ValueError(
            f"El Excel no tiene todas las columnas esperadas. Faltan: {faltantes}\n"
            f"Encabezados encontrados: {encabezados}"
        )

    licencias = []
    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  # fila vacía
        reg = {"_fila_excel": n}
        for clave, i in idx.items():
            valor = fila[i]
            if clave in ("fecha_emision", "fecha_inicio"):
                reg[clave] = _fmt_fecha(valor)
            else:
                reg[clave] = _fmt(valor)
        # Validación de RUT (trabajador y profesional)
        reg["rut_valido"] = rut_valido(reg.get("rut"))
        reg["rut_prof_valido"] = rut_valido(reg.get("rut_profesional"))
        avisos = []
        if not reg["rut_valido"]:
            avisos.append("RUN trabajador inválido")
        if not reg["rut_prof_valido"]:
            avisos.append("RUT profesional inválido")
        reg["avisos"] = avisos
        licencias.append(reg)
    return licencias


if __name__ == "__main__":
    from config import EXCEL_PATH
    for lic in leer_licencias(EXCEL_PATH):
        print(lic)
