"""
Punto de entrada de validación para import de una fila de clase de material.
Flujo Clarion: no ACT → siempre VALIDA_TODA_CLASE; ACT y clase existe → VALIDA_PARCIAL_CLASE;
ACT y clase no existe → VALIDA_TODA_CLASE (validación completa) y si pasa se crea en el insert (ADD).
"""
from typing import Dict, Any, Optional, Set, List

from .common import (
    validate_row_required,
    validate_row_required_full,
    validaciones_clase,
)


def validate_row_class(
    row: Dict[str, Any],
    line_num: int,
    valid_material_keys: Optional[Set[str]] = None,
    valid_uom_codes: Optional[Set[str]] = None,
    actualizar: bool = False,
    siempre_toda: bool = False,
    existing_class_codes: Optional[Set[str]] = None,
    valid_fraction_mex_8: Optional[Set[str]] = None,
    valid_fraction_ame: Optional[Set[str]] = None,
    valid_product_codes_cp: Optional[Set[str]] = None,
) -> List[Dict[str, Any]]:
    """
    Igual que Clarion:
    - No ACT (actualizar=False): siempre TODA (B,D,E,F obligatorios + validaciones_clase).
    - ACT y clase existe: PARCIAL (solo CLASE + validaciones_clase); en insert se actualiza (PUT).
    - ACT y clase no existe: TODA (validación completa); si pasa, en insert se crea (ADD).
    siempre_toda fuerza TODA en todos los casos.
    """
    errors: List[Dict[str, Any]] = []
    err = validate_row_required(row, line_num)
    if err:
        errors.append(err)

    class_code = (row.get("CLASE") or "").strip().upper()[:8]
    use_full = siempre_toda or not actualizar
    if actualizar and existing_class_codes is not None and class_code in existing_class_codes:
        use_full = False

    if use_full:
        err = validate_row_required_full(row, line_num)
        if err:
            errors.append(err)
        # En Actualizar, si la clase no existe se valida completa y si pasa se crea en insert (como Clarion ADD).

    errors.extend(
        validaciones_clase(
        row,
        line_num,
        valid_material_keys,
        valid_uom_codes,
        valid_fraction_mex_8=valid_fraction_mex_8,
        valid_fraction_ame=valid_fraction_ame,
        valid_product_codes_cp=valid_product_codes_cp,
        )
    )
    return errors


def validate_row_class_partial(
    row: Dict[str, Any],
    line_num: int,
    valid_material_keys: Optional[Set[str]] = None,
    valid_uom_codes: Optional[Set[str]] = None,
    valid_fraction_mex_8: Optional[Set[str]] = None,
    valid_fraction_ame: Optional[Set[str]] = None,
    valid_product_codes_cp: Optional[Set[str]] = None,
) -> List[Dict[str, Any]]:
    """Validación parcial (modo Act, clase existente): solo CLASE + validaciones_clase."""
    errors: List[Dict[str, Any]] = []
    err = validate_row_required(row, line_num)
    if err:
        errors.append(err)

    errors.extend(
        validaciones_clase(
        row,
        line_num,
        valid_material_keys,
        valid_uom_codes,
        valid_fraction_mex_8=valid_fraction_mex_8,
        valid_fraction_ame=valid_fraction_ame,
        valid_product_codes_cp=valid_product_codes_cp,
        )
    )
    return errors
