"""
Punto de entrada de validación para import de una fila transportista.
Actualizar = merge: si no existe la clave se crea (valida_toda), si existe se actualizan solo campos enviados (valida_parcial).
Reemplazar = reescribir: siempre valida_toda; en commit se sustituye el registro completo o se agrega.
"""
from typing import Dict, Any, Optional, Set, Tuple, List

from .common import (
    validate_row_transporter_required,
    valida_toda_transportistas,
    valida_parcial_transportistas,
)
from ..common.common_validators import check_desfase_transportistas


def validate_row_transporter(
    row: Dict[str, Any],
    line_num: int,
    actualizar: bool = False,
    existing_transporter_keys: Optional[Set[str]] = None,
    valid_country_ame: Optional[Set[str]] = None,
    state_descriptions_upper: Optional[Set[str]] = None,
    state_country_set: Optional[Set[Tuple[str, str]]] = None,
) -> List[Dict[str, Any]]:
    """
    Valida una fila de CSV de transportistas.
    1. CLAVE TRANSPORTISTA (Col A) vacía → error.
    2. Si actualizar y clave existe en catálogo → valida_parcial (solo validaciones de catálogo; campos vacíos = mantener actual).
    3. Si reemplazar o (actualizar y clave no existe) → valida_toda (A y B obligatorios + validaciones).
    """
    errors: List[Dict[str, Any]] = []
    err = validate_row_transporter_required(row, line_num)
    if err:
        errors.append(err)

    existing = existing_transporter_keys or set()
    clave = (row.get("CLAVE TRANSPORTISTA") or "").strip().upper()
    use_partial = actualizar and bool(clave and clave in existing)

    if use_partial:
        errors.extend(
            valida_parcial_transportistas(
            row,
            line_num,
            valid_country_ame=valid_country_ame,
            state_descriptions_upper=state_descriptions_upper,
            state_country_set=state_country_set,
            )
        )
    else:
        errors.extend(
            valida_toda_transportistas(
            row,
            line_num,
            valid_country_ame=valid_country_ame,
            state_descriptions_upper=state_descriptions_upper,
            state_country_set=state_country_set,
            )
        )
    return errors


def validate_row_transporter_desfase(row: Dict[str, Any], line_num: int) -> Optional[Dict[str, Any]]:
    """Advertencia de desfase si COL_EXTRA (Col S) tiene valor. No bloqueante."""
    return check_desfase_transportistas(row, line_num)
