"""
Limpieza y rotación de logs.

Reglas:
  - logs/*.log           → eliminar si tienen más de DIAS_LOG días
  - logs/_auditoria/*.jsonl → eliminar si tienen más de DIAS_AUDITORIA días
  - logs/_legado/        → nunca tocar (archivos históricos)

Uso:
    python3 limpiar_logs.py           # elimina según reglas por defecto
    python3 limpiar_logs.py --dry-run # muestra qué se eliminaría sin borrar nada
"""

import argparse
import sys
from datetime import date, timedelta
from pathlib import Path

LOGS_DIR       = Path(__file__).resolve().parent / "logs"
DIAS_LOG       = 90
DIAS_AUDITORIA = 365


def _fecha_del_nombre(path: Path) -> date | None:
    """Extrae la fecha del nombre del archivo si sigue el patrón YYYY-MM-DD."""
    stem = path.stem  # e.g. "2026-05-29" o "2026-05-29.audit"
    parte_fecha = stem.split(".")[0]
    try:
        return date.fromisoformat(parte_fecha)
    except ValueError:
        return None



def main() -> None:
    parser = argparse.ArgumentParser(description="Limpia logs viejos del proyecto.")
    parser.add_argument(
        "--dry-run", action="store_true",
        help="Muestra qué se eliminaría sin borrar nada."
    )
    parser.add_argument(
        "--dias-log", type=int, default=DIAS_LOG,
        help=f"Días de retención para .log (default: {DIAS_LOG})"
    )
    parser.add_argument(
        "--dias-auditoria", type=int, default=DIAS_AUDITORIA,
        help=f"Días de retención para .audit.jsonl (default: {DIAS_AUDITORIA})"
    )
    args = parser.parse_args()
    dias_log       = args.dias_log
    dias_auditoria = args.dias_auditoria

    hoy = date.today()

    limite_log   = hoy - timedelta(days=dias_log)
    limite_audit = hoy - timedelta(days=dias_auditoria)

    candidatos = []
    for archivo in LOGS_DIR.rglob("*"):
        if not archivo.is_file():
            continue
        if "_legado" in archivo.parts:
            continue
        fecha = _fecha_del_nombre(archivo)
        if fecha is None:
            continue
        if archivo.suffix == ".jsonl" and "auditoria" in str(archivo):
            if fecha < limite_audit:
                candidatos.append((archivo, f"auditoría > {dias_auditoria} días ({fecha})"))
        elif archivo.suffix == ".log":
            if fecha < limite_log:
                candidatos.append((archivo, f"log > {dias_log} días ({fecha})"))
    candidatos.sort()

    if not candidatos:
        print(f"Nada para limpiar (hoy: {hoy}, retención: log={dias_log}d, auditoría={dias_auditoria}d).")
        return

    modo = "DRY-RUN" if args.dry_run else "ELIMINANDO"
    print(f"\n[{modo}] {len(candidatos)} archivo(s) a eliminar:\n")

    eliminados = 0
    errores = 0
    for archivo, motivo in candidatos:
        rel = archivo.relative_to(LOGS_DIR)
        if args.dry_run:
            print(f"  {rel}  ({motivo})")
        else:
            try:
                archivo.unlink()
                print(f"  ✓ {rel}  ({motivo})")
                eliminados += 1
            except Exception as e:
                print(f"  ✗ {rel}  ERROR: {e}", file=sys.stderr)
                errores += 1

    print()
    if args.dry_run:
        print(f"Dry-run completo. {len(candidatos)} archivo(s) serían eliminados.")
    else:
        print(f"Listo. Eliminados: {eliminados} | Errores: {errores}")


if __name__ == "__main__":
    main()
