"""
============================================================
 Microservicio Python (FastAPI) - sis_datosBD
 Consulta fuentes externas (RENIEC / SUNAT / terceros) cuando
 el dato NO existe en la base de datos propia.

 El PHP lo llama internamente:
   GET /external/dni/{dni}
   GET /external/ruc/{ruc}
 protegido por la cabecera  X-Internal-Token.
============================================================
"""
from __future__ import annotations

import os
import re
from fastapi import FastAPI, Header, HTTPException
from fastapi.responses import JSONResponse

# Proveedores externos concretos (ver providers.py)
from providers import fetch_dni, fetch_ruc

INTERNAL_TOKEN = os.getenv("PY_SERVICE_TOKEN", "cambia-este-token-interno")

app = FastAPI(title="sis_datosBD - External Microservice", version="1.0.0")


def _check_token(token: str | None) -> None:
    """Solo el backend PHP (con el token interno) puede llamar aqui."""
    if token != INTERNAL_TOKEN:
        raise HTTPException(status_code=401, detail="Token interno invalido.")


@app.get("/health")
def health():
    return {"ok": True, "service": "external-microservice"}


@app.get("/external/dni/{dni}")
def external_dni(dni: str, x_internal_token: str | None = Header(default=None)):
    _check_token(x_internal_token)

    if not re.fullmatch(r"\d{8}", dni):
        raise HTTPException(status_code=422, detail="DNI invalido.")

    data = fetch_dni(dni)
    if not data:
        return JSONResponse({"ok": False, "error": "No encontrado"}, status_code=404)
    return {"ok": True, "source": "external", "data": data}


@app.get("/external/ruc/{ruc}")
def external_ruc(ruc: str, x_internal_token: str | None = Header(default=None)):
    _check_token(x_internal_token)

    if not re.fullmatch(r"\d{11}", ruc):
        raise HTTPException(status_code=422, detail="RUC invalido.")

    data = fetch_ruc(ruc)
    if not data:
        return JSONResponse({"ok": False, "error": "No encontrado"}, status_code=404)
    return {"ok": True, "source": "external", "data": data}
