from __future__ import annotations

import logging
from typing import Any, Dict, Optional

import httpx

from core.config import settings

logger = logging.getLogger(__name__)


class ExpedienteExternalService:
    """
    Cliente HTTP real para el API externo de digitalización de archivos en Ventanilla Única.

    Endpoints utilizados:
      POST {base_url}/api/v1/expediente-archivos/digitalizar-archivo-json
      GET  {base_url}/api/v1/expediente-archivos/status-digitalizacion-task/{task_id}
    """

    def __init__(self) -> None:
        self.base_url = settings.COVE_API_URL.strip()
        self.verify_ssl = settings.COVE_API_VERIFY_SSL

    def digitalizar_archivo_json(self, payload: Dict[str, Any]) -> Dict[str, Any]:
        """
        Envía un JSON con el documento + configuracion_vu al endpoint de digitalización.
        Retorna la respuesta JSON tal como viene del API externo.
        """
        url = f"{self.base_url.rstrip('/')}/api/v1/expediente-archivos/digitalizar-archivo-json"

        configuracion_vu = payload.get("configuracion_vu") or {}
        logger.info(
            "Sending digitalizar-archivo-json: nombre_archivo=%s rfc_vu=%s clave_fiel_len=%s clave_ws_len=%s cer_len=%s key_len=%s",
            payload.get("nombre_archivo"),
            configuracion_vu.get("rfc_usuario_vu"),
            len(configuracion_vu.get("clave_fiel") or ""),
            len(configuracion_vu.get("clave_webservice") or ""),
            len(configuracion_vu.get("archivo_cer_base64") or ""),
            len(configuracion_vu.get("archivo_key_base64") or ""),
        )

        # connect=10s, read=120s: la subida del PDF puede tomar tiempo en el servidor VU
        with httpx.Client(timeout=httpx.Timeout(120.0, connect=10.0), verify=self.verify_ssl) as client:
            response = client.post(url, json=payload)
            response.raise_for_status()
            return response.json()

    def get_status(self, task_id: str) -> Optional[Dict[str, Any]]:
        """
        Consulta el estado de una tarea de digitalización en el API externo.
        """
        url = f"{self.base_url.rstrip('/')}/api/v1/expediente-archivos/status-digitalizacion-task/{task_id}"
        logger.debug("Consulting expediente task status: task_id=%s url=%s", task_id, url)

        # read=None: sin límite de lectura — VU mantiene la conexión abierta mientras procesa.
        # El timeout global del polling loop (300 s) actúa como cota máxima real.
        with httpx.Client(timeout=httpx.Timeout(None, connect=10.0), verify=self.verify_ssl) as client:
            response = client.get(url)
            response.raise_for_status()
            return response.json()
