"""
Punto de entrada de validación para import de una fila trailer.
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_trailer_required,
    valida_toda_trailer,
    valida_parcial_trailer,
)
from ..common.common_validators import check_desfase_trailers


def validate_row_trailer(
    row: Dict[str, Any],
    line_num: int,
    actualizar: bool = False,
    existing_trailer_numbers: Optional[Set[str]] = None,
    valid_trailer_type_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,
    state_ame_to_description: Optional[Dict[str, str]] = None,
) -> List[Dict[str, Any]]:
    """
    Valida una fila de CSV de trailers.
    1. Clave (NUMERO TRAILER) vacía → error.
    2. Si actualizar y clave en existing_trailer_numbers → valida_parcial_trailer.
    3. Si no actualizar o clave no existe → valida_toda_trailer.
    Desfase (COL_EXTRA) no se valida aquí; el caller puede llamar validate_row_trailer_desfase para advertencias no bloqueantes.
    """
    errors: List[Dict[str, Any]] = []
    err = validate_row_trailer_required(row, line_num)
    if err:
        errors.append(err)

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

    if use_partial:
        errors.extend(
            valida_parcial_trailer(
            row,
            line_num,
            valid_trailer_type_keys=valid_trailer_type_keys,
            valid_country_ame=valid_country_ame,
            state_descriptions_upper=state_descriptions_upper,
            state_country_set=state_country_set,
            state_ame_to_description=state_ame_to_description,
            )
        )
    else:
        errors.extend(
            valida_toda_trailer(
            row,
            line_num,
            valid_trailer_type_keys=valid_trailer_type_keys,
            valid_country_ame=valid_country_ame,
            state_descriptions_upper=state_descriptions_upper,
            state_country_set=state_country_set,
            state_ame_to_description=state_ame_to_description,
            )
        )
    return errors


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