"""Normalisation (stockage E.164) et affichage des numéros de téléphone."""
import re

TEL_AFFICHAGE_INTERNATIONAL = "international"
TEL_AFFICHAGE_NATIONAL = "national"
TEL_AFFICHAGE_CHOICES = (TEL_AFFICHAGE_INTERNATIONAL, TEL_AFFICHAGE_NATIONAL)

TEL_AFFICHAGE_LABELS = {
    TEL_AFFICHAGE_INTERNATIONAL: "International (+33 6 12 34 56 78)",
    TEL_AFFICHAGE_NATIONAL: "National (06 12 34 56 78)",
}


def _digits_only(value: str) -> str:
    return re.sub(r"\D", "", value)


def normalize_phone(raw: str) -> str:
    """Normalise vers E.164 (+indicatif…). Chaîne vide si entrée vide."""
    s = (raw or "").strip()
    if not s:
        return ""

    compact = re.sub(r"[\s.\-()/]", "", s)

    if compact.startswith("+"):
        digits = _digits_only(compact)
        return f"+{digits}" if digits else ""

    if compact.startswith("00"):
        digits = _digits_only(compact[2:])
        return f"+{digits}" if digits else ""

    digits = _digits_only(compact)

    # Numéro français national : 0X XX XX XX XX
    if len(digits) == 10 and digits.startswith("0"):
        return f"+33{digits[1:]}"

    # Déjà sans + mais avec indicatif 33
    if len(digits) == 11 and digits.startswith("33"):
        return f"+{digits}"

    # 9 chiffres sans le 0 initial — suppose France
    if len(digits) == 9 and digits[0] in "123456789":
        return f"+33{digits}"

    if digits:
        return f"+{digits}"

    return ""


def is_french_phone(normalized: str) -> bool:
    """True si numéro français valide en E.164 (+33 + 9 chiffres)."""
    if not normalized or not normalized.startswith("+33"):
        return False
    rest = normalized[3:]
    return len(rest) == 9 and rest.isdigit() and rest[0] in "123456789"


def format_phone(raw: str, style: str = TEL_AFFICHAGE_INTERNATIONAL) -> str:
    """Affiche un numéro selon la préférence utilisateur."""
    normalized = normalize_phone(raw)
    if not normalized:
        return (raw or "").strip()

    if style == TEL_AFFICHAGE_NATIONAL and is_french_phone(normalized):
        return f"0{normalized[3:]}"

    return normalized
