"""
Validadores de formato para RFC (Nacional) y TAX-ID (Extranjero) en clientes y proveedores.
"""

import re

# Formato RFC México: 3-4 letras (A-Z, &, Ñ), 6 dígitos (fecha), 3 caracteres homoclave. Ej: XAXX010101000
RFC_PATTERN = re.compile(r"^[A-Z&Ñ]{3,4}\d{6}[A-Z0-9]{3}$", re.IGNORECASE)

# TAX-ID extranjero: 2 dígitos, guión, resto alfanumérico. Ej: 12-3456789 (EIN US). Total máx 30.
TAX_ID_PATTERN = re.compile(r"^\d{2}-[A-Z0-9]{1,27}$", re.IGNORECASE)


def is_valid_rfc(value: str) -> bool:
    """Valida formato RFC mexicano. Acepta cadena vacía/None como inválida (no opcional aquí)."""
    if not value or not isinstance(value, str):
        return False
    normalized = value.strip().upper()
    return bool(normalized and RFC_PATTERN.match(normalized))


def is_valid_tax_id(value: str) -> bool:
    """Valida formato TAX-ID (extranjero): 2 dígitos, guión y resto alfanumérico. Ej: 12-3456789."""
    if not value or not isinstance(value, str):
        return False
    normalized = value.strip()
    return bool(normalized and len(normalized) <= 30 and TAX_ID_PATTERN.match(normalized))
