"""Extrae las remuneraciones (3 meses) del PDF de Cobro SIL (Determinación de la
Base de Cálculo del Subsidio). El reporte tiene un formato fijo de tablas."""
import re
import pdfplumber

_MES = re.compile(r"^\d{1,2}/\d{4}$")
_MONEY = re.compile(r"^-?[\d.,]+$")


def _num(cell):
    """'1,339,299' -> 1339299 ; '' -> None"""
    if cell is None:
        return None
    s = str(cell).strip().replace(".", "").replace(",", "")
    if s in ("", "-"):
        return None
    return int(s) if s.isdigit() else None


def _norm(s):
    return " ".join(str(s or "").strip().lower().split())


def extraer_remuneraciones(pdf_path):
    """Devuelve un dict con listas de 3 valores (mes más reciente primero):
    meses, imponible, cotizacion_afp, salud, impuesto, liquido.
    Si algo no se encuentra, la lista respectiva queda vacía."""
    filas = []
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            for tabla in page.extract_tables():
                filas.extend(tabla)

    meses = []
    for row in filas:
        celdas = [str(c).strip() for c in row if c and str(c).strip()]
        posibles = [c for c in celdas if _MES.match(c)]
        if len(posibles) >= 3:
            meses = posibles[:3]
            break

    def valores_de(*claves):
        """Busca la fila cuyo texto (etiqueta) contiene alguna clave y devuelve
        sus últimos 3 números."""
        for row in filas:
            texto = _norm(" ".join(str(c) for c in row if c and not _MONEY.match(str(c).strip())))
            if any(k in texto for k in claves):
                nums = [_num(c) for c in row if _num(c) is not None]
                if len(nums) >= 3:
                    return nums[-3:]
        return []

    return {
        "meses": meses,
        "imponible": valores_de("renta imponible previsional"),
        "cotizacion_afp": valores_de("cotizaciones prevision"),
        "salud": _fila_salud(filas),
        "impuesto": valores_de("impuesto unico"),
        "liquido": valores_de("total remuneraciones netas", "remuneraciones n"),
    }


def _fila_salud(filas):
    """La fila 'SALUD' (descuento de salud), evitando 'RENTA IMPON. SALUD'."""
    for row in filas:
        etiquetas = [_norm(c) for c in row if c and not _MONEY.match(str(c).strip())]
        if any(e == "salud" for e in etiquetas):
            nums = [_num(c) for c in row if _num(c) is not None]
            if len(nums) >= 3:
                return nums[-3:]
    return []


# --- Escritura de columnas de remuneraciones en el Excel ---
import openpyxl

# (encabezado, clave, índice de mes)  ·  se generan 3 meses de detalle completo
def _columnas():
    cols = []
    for i in range(3):
        n = i + 1
        cols += [
            (f"Mes {n}", "meses", i),
            (f"Imponible {n}", "imponible", i),
            (f"Cotiz AFP {n}", "cotizacion_afp", i),
            (f"Salud {n}", "salud", i),
            (f"Impuesto {n}", "impuesto", i),
            (f"Líquido {n}", "liquido", i),
        ]
    cols.append(("PDF Cobro SIL", "_pdf", None))
    return cols


def escribir_comentario(excel_path, fila_excel, texto, columna="Comentario"):
    """Escribe un comentario/observación (resultado o error) en la fila indicada,
    en una columna que se crea si no existe."""
    wb = openpyxl.load_workbook(excel_path)
    ws = wb.active
    encabezados = [c.value for c in ws[1]]
    if columna in encabezados:
        col = encabezados.index(columna) + 1
    else:
        col = len(encabezados) + 1
        ws.cell(row=1, column=col, value=columna)
    ws.cell(row=fila_excel, column=col, value=texto)
    wb.save(excel_path)


def escribir_en_excel(excel_path, fila_excel, remun, pdf_nombre=""):
    """Agrega (si faltan) las columnas de remuneraciones y escribe los valores
    en la fila indicada (número de fila real de la planilla)."""
    wb = openpyxl.load_workbook(excel_path)
    ws = wb.active
    encabezados = [c.value for c in ws[1]]
    col_de = {}
    for header, _, _ in _columnas():
        if header in encabezados:
            col_de[header] = encabezados.index(header) + 1
        else:
            encabezados.append(header)
            col_de[header] = len(encabezados)
            ws.cell(row=1, column=col_de[header], value=header)

    for header, clave, idx in _columnas():
        if clave == "_pdf":
            valor = pdf_nombre
        else:
            lista = remun.get(clave) or []
            valor = lista[idx] if idx < len(lista) else ""
        ws.cell(row=fila_excel, column=col_de[header], value=valor)

    wb.save(excel_path)


if __name__ == "__main__":
    import sys, json
    ruta = sys.argv[1] if len(sys.argv) > 1 else "documentos/129400320_10536097-5.pdf"
    print(json.dumps(extraer_remuneraciones(ruta), ensure_ascii=False, indent=2))
