"""Historial persistente de licencias procesadas (guardado en historial.json).
Permite reabrir los PDF de Cobro SIL y exportar un Excel con los sueldos."""
import json
import os
from datetime import datetime
from io import BytesIO
import openpyxl

HIST_FILE = "historial.json"


def leer():
    if not os.path.exists(HIST_FILE):
        return []
    try:
        with open(HIST_FILE, encoding="utf-8") as f:
            return json.load(f)
    except Exception:
        return []


def agregar(entrada):
    """Agrega una licencia procesada al historial (con marca de tiempo)."""
    h = leer()
    e = dict(entrada)
    e["timestamp"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    h.append(e)
    with open(HIST_FILE, "w", encoding="utf-8") as f:
        json.dump(h, f, ensure_ascii=False, indent=1)
    return e


def _g(lista, i):
    lista = lista or []
    return lista[i] if i < len(lista) else ""


def filtrar(entradas, desde=None, hasta=None):
    """Filtra por rango de fechas (formato 'YYYY-MM-DD'). El timestamp es
    'YYYY-MM-DD HH:MM:SS', así que basta comparar los primeros 10 caracteres."""
    res = []
    for e in entradas:
        f = str(e.get("timestamp", ""))[:10]
        if desde and f < desde:
            continue
        if hasta and f > hasta:
            continue
        res.append(e)
    return res


def generar_excel_sueldos(desde=None, hasta=None):
    """Construye en memoria un Excel con los sueldos del historial (opcionalmente
    filtrado por rango de fechas)."""
    h = filtrar(leer(), desde, hasta)
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "Sueldos"
    headers = ["Fecha Proceso", "RUT", "Nombre", "N° Licencia", "Excel Origen"]
    for n in (1, 2, 3):
        headers += [f"Mes {n}", f"Imponible {n}", f"Cotiz AFP {n}",
                    f"Salud {n}", f"Impuesto {n}", f"Líquido {n}"]
    headers.append("PDF")
    ws.append(headers)

    for e in h:
        rem = e.get("remuneraciones") or {}
        fila = [e.get("timestamp", ""), e.get("rut", ""), e.get("nombre", ""),
                e.get("num_licencia", ""), e.get("excel_origen", "")]
        for i in range(3):
            fila += [_g(rem.get("meses"), i), _g(rem.get("imponible"), i),
                     _g(rem.get("cotizacion_afp"), i), _g(rem.get("salud"), i),
                     _g(rem.get("impuesto"), i), _g(rem.get("liquido"), i)]
        fila.append(e.get("pdf", ""))
        ws.append(fila)

    buf = BytesIO()
    wb.save(buf)
    buf.seek(0)
    return buf
