"""
Validación de FECHA FACTURA vs pedimento consolidado en CSV de encabezados.

Paridad con `validate_common` (factura manual) cuando `pedimento_type == "consolidated"`:
- Sin fechas de pedimento en catálogo → equivalente a MISSING_PEDIMENTO_DATES.
- Rango permitido: [start_date, end_date] si `start_date` está capturada en el catálogo;
  si no, [entry_date, end_date] (mismo criterio que captura manual / periodo consolidado).
"""
from datetime import date, datetime
from typing import Any, Dict, Optional


def _to_calendar_date(val: Any) -> Optional[date]:
    if val is None:
        return None
    if isinstance(val, datetime):
        return val.date()
    if isinstance(val, date):
        return val
    if hasattr(val, "date"):
        return val.date()  # type: ignore[union-attr]
    return None


def validate_consolidated_invoice_date_csv(
    *,
    line_num: int,
    pedimento_key_display: str,
    pedimento_type: str,
    invoice_date_parsed: Optional[datetime],
    entry_raw: Any,
    end_raw: Any,
    start_raw: Any = None,
) -> Optional[Dict[str, Any]]:
    """
    Retorna dict de error compatible con validadores CSV (line, col, msg, …) o None si aplica/no hay error.

    No aplica si el pedimento no es consolidado.
    """
    pt = (pedimento_type or "").strip().lower()
    if pt != "consolidated":
        return None

    if end_raw is None:
        return {
            "line": line_num,
            "col": "PEDIMENTO",
            "msg": (
                f"Error: (Celda A{line_num}) El Pedimento {pedimento_key_display} no tiene fechas registradas "
                "en el catálogo."
            ),
            "solution": "Verifica las fechas del Pedimento en el catálogo",
            "code": "MISSING_PEDIMENTO_DATES",
        }

    range_low_raw = start_raw if start_raw is not None else entry_raw
    if range_low_raw is None:
        return {
            "line": line_num,
            "col": "PEDIMENTO",
            "msg": (
                f"Error: (Celda A{line_num}) El Pedimento {pedimento_key_display} no tiene fechas registradas "
                "en el catálogo."
            ),
            "solution": "Verifica las fechas del Pedimento en el catálogo",
            "code": "MISSING_PEDIMENTO_DATES",
        }

    if not invoice_date_parsed:
        return None

    entry = _to_calendar_date(range_low_raw)
    end = _to_calendar_date(end_raw)
    if entry is None or end is None:
        return {
            "line": line_num,
            "col": "PEDIMENTO",
            "msg": (
                f"Error: (Celda A{line_num}) El Pedimento {pedimento_key_display} no tiene fechas registradas "
                "en el catálogo."
            ),
            "solution": "Verifica las fechas del Pedimento en el catálogo",
            "code": "MISSING_PEDIMENTO_DATES",
        }

    if isinstance(invoice_date_parsed, datetime):
        inv_d = invoice_date_parsed.date()
    elif isinstance(invoice_date_parsed, date):
        inv_d = invoice_date_parsed
    else:
        return None

    if inv_d < entry or inv_d > end:
        return {
            "line": line_num,
            "col": "FECHA FACTURA",
            "msg": (
                f"Error: (Celda D{line_num} y A{line_num}) La Fecha de la Factura no corresponde al rango "
                f"de fechas del Pedimento {pedimento_key_display}."
            ),
            "solution": (
                "Capturar una Fecha de Factura dentro del rango de fechas del pedimento consolidado "
                "registrado en el catálogo."
            ),
            "code": "DATE_OUT_OF_RANGE",
        }
    return None
