"""Factory del cliente CRM según Settings."""

from __future__ import annotations

import logging

from config import Settings, get_settings
from crm.client import CrmApiClient

logger = logging.getLogger(__name__)


def resolve_crm_base_url(settings: Settings) -> str:
    """Prioriza URL absoluta; si no, arma con base_id + template."""
    explicit = (settings.crm_api_base_url or "").strip()
    if explicit:
        return explicit.rstrip("/")

    base_id = (settings.crm_api_base_id or "").strip()
    template = (settings.crm_api_base_template or "").strip()
    if not base_id:
        raise ValueError(
            "Definí CRM_API_BASE_URL o CRM_API_BASE_ID para la API externa"
        )
    if "{base_id}" not in template:
        # Permitir template fijo o con {base_id}
        return template.rstrip("/") if template else f"https://{base_id}.mockapi.io/api/v1"
    return template.format(base_id=base_id).rstrip("/")


def create_crm_client(settings: Settings | None = None) -> CrmApiClient:
    cfg = settings or get_settings()
    base_url = resolve_crm_base_url(cfg) if cfg.crm_api_enabled else "http://localhost/"
    endpoints = {
        "clientes": cfg.crm_endpoint_clientes,
        "productos": cfg.crm_endpoint_productos,
        "polizas": cfg.crm_endpoint_polizas,
    }
    # Endpoints extra desde JSON simple en env (opcional)
    extra = (cfg.crm_endpoints_extra or "").strip()
    if extra:
        import json

        try:
            parsed = json.loads(extra)
            if isinstance(parsed, dict):
                for key, value in parsed.items():
                    if key and value:
                        endpoints[str(key)] = str(value)
        except json.JSONDecodeError:
            logger.warning("CRM_ENDPOINTS_EXTRA no es JSON válido: %r", extra)

    return CrmApiClient(
        base_url=base_url,
        endpoints=endpoints,
        api_key=cfg.crm_api_key,
        timeout=cfg.crm_api_timeout,
        enabled=cfg.crm_api_enabled,
    )
