"""
Proveedores de datos externos.

Aqui conectas las fuentes reales (APIs de RENIEC/SUNAT o terceros como
apis.net.pe, decolecta, factiliza, etc.). Por defecto devuelve datos
SIMULADOS (mock) para que el sistema funcione end-to-end sin credenciales.

Para produccion:
  1. Define las variables de entorno con tu token/endpoint del proveedor.
  2. Descomenta el bloque real en fetch_dni / fetch_ruc.
"""
from __future__ import annotations

import os
import httpx

# Ejemplo de proveedor tipo apis.net.pe (ajusta a tu proveedor real)
PROVIDER_BASE = os.getenv("PROVIDER_BASE_URL", "")   # ej: https://api.apis.net.pe/v2
PROVIDER_TOKEN = os.getenv("PROVIDER_TOKEN", "")
USE_MOCK = not (PROVIDER_BASE and PROVIDER_TOKEN)


def _client() -> httpx.Client:
    return httpx.Client(timeout=8.0, headers={
        "Authorization": f"Bearer {PROVIDER_TOKEN}",
        "Accept": "application/json",
    })


def fetch_dni(dni: str) -> dict | None:
    if USE_MOCK:
        return {
            "dni": dni,
            "nombres": "NOMBRE SIMULADO",
            "apellido_paterno": "APELLIDO1",
            "apellido_materno": "APELLIDO2",
            "nombre_completo": "APELLIDO1 APELLIDO2 NOMBRE SIMULADO",
            "sexo": "M",
        }

    # --- Bloque real (ejemplo) ---
    try:
        with _client() as c:
            r = c.get(f"{PROVIDER_BASE}/reniec/dni", params={"numero": dni})
            if r.status_code != 200:
                return None
            j = r.json()
            return {
                "dni": dni,
                "nombres": j.get("nombres"),
                "apellido_paterno": j.get("apellidoPaterno"),
                "apellido_materno": j.get("apellidoMaterno"),
                "nombre_completo": j.get("nombreCompleto"),
            }
    except httpx.HTTPError:
        return None


def fetch_ruc(ruc: str) -> dict | None:
    if USE_MOCK:
        return {
            "ruc": ruc,
            "razon_social": "EMPRESA SIMULADA S.A.C.",
            "estado": "ACTIVO",
            "condicion": "HABIDO",
            "direccion": "AV. SIMULADA 123",
        }

    try:
        with _client() as c:
            r = c.get(f"{PROVIDER_BASE}/sunat/ruc", params={"numero": ruc})
            if r.status_code != 200:
                return None
            j = r.json()
            return {
                "ruc": ruc,
                "razon_social": j.get("razonSocial"),
                "estado": j.get("estado"),
                "condicion": j.get("condicion"),
                "direccion": j.get("direccion"),
            }
    except httpx.HTTPError:
        return None
