"""
Punto de entrada de validación para import de una fila vehículo.
Paridad Clarion: desfase (advertencia), CLAVE vacía, VALIDA_TODA vs VALIDA_PARCIAL según actualizar y clave existente.
"""
from typing import Dict, Any, Optional, Set, Tuple, List

from .common import (
    validate_row_vehicle_required,
    valida_toda_transporte,
    valida_parcial_transporte,
)
from ..common.common_validators import check_desfase_vehicles


def validate_row_vehicle(
    row: Dict[str, Any],
    line_num: int,
    actualizar: bool = False,
    existing_vehicle_keys: Optional[Set[str]] = None,
    valid_transport_codes: 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 vehículos.
    1. CLAVE vacía → error.
    2. Si actualizar y CLAVE en existing_vehicle_keys → valida_parcial_transporte (sin exigir CODIGO DE ENTIDAD).
    3. Si no actualizar o CLAVE no existe → valida_toda_transporte (CODIGO DE ENTIDAD obligatorio).
    Desfase (COL_EXTRA) no se valida aquí; el caller puede llamar validate_row_vehicle_desfase para advertencias no bloqueantes.
    """
    errors: List[Dict[str, Any]] = []
    err = validate_row_vehicle_required(row, line_num)
    if err:
        errors.append(err)

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

    if use_partial:
        errors.extend(
            valida_parcial_transporte(
            row, line_num,
            valid_transport_codes=valid_transport_codes,
            valid_country_ame=valid_country_ame,
            state_descriptions_upper=state_descriptions_upper,
            state_country_set=state_country_set,
            )
        )
    else:
        errors.extend(
            valida_toda_transporte(
            row, line_num,
            valid_transport_codes=valid_transport_codes,
            valid_country_ame=valid_country_ame,
            state_descriptions_upper=state_descriptions_upper,
            state_country_set=state_country_set,
            )
        )
    return errors


def validate_row_vehicle_desfase(row: Dict[str, Any], line_num: int) -> Optional[Dict[str, Any]]:
    """
    Advertencia de desfase si COL_EXTRA (Col R) tiene valor. No bloqueante; el caller puede acumular en warnings.
    """
    return check_desfase_vehicles(row, line_num)
