"""
Punto de entrada de validación para import de una fila conductor.
Paridad Clarion: desfase (advertencia), obligatorios A y C, VALIDA_TODA vs VALIDA_PARCIAL según actualizar y clave existente.
"""
from typing import Dict, Any, Optional, Set, Tuple, List

from ..common.common_validators import parse_int, check_desfase_drivers
from .common import (
    validate_row_driver_required,
    valida_toda_conductor,
    valida_parcial_conductor,
)


def validate_row_driver(
    row: Dict[str, Any],
    line_num: int,
    actualizar: bool = False,
    existing_driver_keys: Optional[Set[Tuple[str, int]]] = None,
    valid_transporter_keys: Optional[Set[str]] = None,
    valid_country_ame: Optional[Set[str]] = None,
) -> List[Dict[str, Any]]:
    """
    Valida una fila de CSV de conductores.
    1. Obligatorios A (TRANSPORTISTA) y C (CLAVE CONDUCTOR) vacíos → error.
    2. Si actualizar y (TRANSPORTISTA, LINEA) en existing_driver_keys → valida_parcial_conductor.
    3. Si no actualizar o conductor no existe → valida_toda_conductor (obligatorios A, C y LINEA + validaciones).
    Desfase (COL_EXTRA) no se valida aquí; el caller puede llamar validate_row_driver_desfase para advertencias no bloqueantes.
    """
    errors: List[Dict[str, Any]] = []
    err = validate_row_driver_required(row, line_num)
    if err:
        errors.append(err)

    existing = existing_driver_keys or set()
    transporter_key = (row.get("TRANSPORTISTA") or "").strip().upper()
    line = parse_int(row.get("LINEA"))
    use_partial = (
        actualizar
        and bool(transporter_key and line is not None)
        and (transporter_key, line) in existing
    )

    if use_partial:
        errors.extend(
            valida_parcial_conductor(
            row,
            line_num,
            valid_transporter_keys=valid_transporter_keys,
            valid_country_ame=valid_country_ame,
            )
        )
    else:
        errors.extend(
            valida_toda_conductor(
            row,
            line_num,
            valid_transporter_keys=valid_transporter_keys,
            valid_country_ame=valid_country_ame,
            )
        )
    return errors


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