"""Validação e normalização de valores de extração."""

import re
from datetime import datetime


def normalize_value(field_type: str, raw: str) -> tuple[str | None, str | None]:
    """Retorna (valor_normalizado, mensagem_erro)."""
    raw = (raw or "").strip()
    if field_type == "O" or field_type == "M":
        return raw, None
    if field_type == "B":
        if raw.lower() in ("true", "1", "sim", "yes", "s"):
            return "True", None
        if raw.lower() in ("false", "0", "não", "nao", "no", "n"):
            return "False", None
        return None, "Use Sim ou Não."
    if field_type == "I":
        if not raw:
            return "", None
        try:
            return str(int(raw.replace(",", ".").split(".")[0])), None
        except ValueError:
            return None, "Informe um número inteiro."
    if field_type == "F":
        if not raw:
            return "", None
        try:
            return str(float(raw.replace(",", "."))), None
        except ValueError:
            return None, "Informe um número decimal."
    if field_type == "D":
        if not raw:
            return "", None
        for fmt in ("%Y-%m-%d", "%d/%m/%Y", "%m/%d/%Y"):
            try:
                return datetime.strptime(raw, fmt).strftime("%Y-%m-%d"), None
            except ValueError:
                continue
        return None, "Data inválida. Use AAAA-MM-DD ou DD/MM/AAAA."
    return raw, None


def parse_lookup_ids(raw_list: list) -> list[int]:
    ids = []
    for x in raw_list:
        if str(x).isdigit():
            ids.append(int(x))
    return ids
