"""Modelos ligeros de la API CRM (campos conocidos + payload crudo)."""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import Any


@dataclass
class ResourceResult:
    """Respuesta genérica de un recurso REST."""

    data: Any
    status_code: int = 200
    resource: str = ""
    path: str = ""

    @property
    def ok(self) -> bool:
        return 200 <= self.status_code < 300

    @property
    def is_empty(self) -> bool:
        if self.data is None:
            return True
        if isinstance(self.data, (list, dict, str)) and not self.data:
            return True
        return False


@dataclass
class Cliente:
    id: str
    nombre: str = ""
    apellido: str = ""
    raw: dict[str, Any] = field(default_factory=dict)

    @classmethod
    def from_api(cls, payload: dict[str, Any]) -> Cliente:
        return cls(
            id=str(payload.get("id") or "").strip(),
            nombre=str(payload.get("nombre") or payload.get("name") or "").strip(),
            apellido=str(
                payload.get("apellido") or payload.get("lastname") or ""
            ).strip(),
            raw=dict(payload),
        )

    @property
    def nombre_completo(self) -> str:
        return " ".join(p for p in (self.nombre, self.apellido) if p).strip()


@dataclass
class Producto:
    id: str
    nombre: str = ""
    raw: dict[str, Any] = field(default_factory=dict)

    @classmethod
    def from_api(cls, payload: dict[str, Any]) -> Producto:
        return cls(
            id=str(payload.get("id") or "").strip(),
            nombre=str(
                payload.get("nombre")
                or payload.get("name")
                or payload.get("descripcion")
                or ""
            ).strip(),
            raw=dict(payload),
        )


@dataclass
class Polizas:
    id: str
    nombre: str = ""
    apellido: str = ""
    poliza: str = ""
    producto: str = ""
    plan_actual: str = ""
    precio_actual: float = 0.0
    plan_ofrecido: str = ""
    precio_ofrecido: float = 0.0
    plan_retencion: str = ""
    monto_asegurado: float = 0.0
    moneda: str = ""
    creado: str = ""
    raw: dict[str, Any] = field(default_factory=dict)

    @classmethod
    def from_api(cls, payload: dict[str, Any]) -> Polizas:
        try:
            precio = float(payload.get("precio") or 0.0)
        except (TypeError, ValueError):
            precio = 0.0
        return cls(
            id=str(payload.get("id") or "").strip(),
            nombre=str(payload.get("nombre") or "").strip(),
            apellido=str(payload.get("apellido") or "").strip(),
            poliza=str(payload.get("poliza") or "").strip(),
            producto=str(payload.get("producto") or "").strip(),
            plan_actual=str(payload.get("plan_actual") or "").strip(),
            precio_actual=str(payload.get("precio_actual") or "").strip(),
            moneda=str(payload.get("moneda") or "").strip(),
            creado=str(payload.get("creado") or "").strip(),
            plan_ofrecido=str(payload.get("plan_ofrecido") or "").strip(),
            precio_ofrecido=str(payload.get("precio_ofrecido") or "").strip(),
            plan_retencion=str(payload.get("plan_retencion") or "").strip(),            
            monto_asegurado=float(payload.get("monto_asegurado") or 0.0),
            raw=dict(payload),
        )

    @property
    def nombre_completo(self) -> str:
        return " ".join(p for p in (self.nombre, self.apellido) if p).strip()

    def to_public(self) -> dict[str, Any]:
        return {
            "id": self.id,
            "nombre": self.nombre,
            "apellido": self.apellido,
            "nombre_completo": self.nombre_completo,
            "poliza": self.poliza,
            "producto": self.producto,
            "plan_actual": self.plan_actual,
            "precio_actual": self.precio_actual,
            "moneda": self.moneda,
            "creado": self.creado,
            "plan_ofrecido": self.plan_ofrecido,
            "precio_ofrecido": self.precio_ofrecido,            
            "plan_retencion": self.plan_retencion,
            "monto_asegurado": self.monto_asegurado,
            "raw": self.raw,
        }

    def to_prompt_block(self) -> str:
        """Texto para inyectar en el agente OpenAI."""
        lines = [
            "DATOS PRECARGADOS DE LA PÓLIZA DEL CLIENTE (fuente CRM, no inventes otros):",
            f"- Documento/ID: {self.id}",
            f"- Nombre: {self.nombre_completo or '(no informado)'}",
            f"- Número de póliza: {self.poliza or '(no informado)'}",
            f"- Producto: {self.producto or '(no informado)'}",
            f"- Plan_actual: {self.plan_actual or '(no informado)'}",
            f"- Precio_actual: {self.precio_actual}",
            f"- Moneda: {self.moneda}",
            f"- Fecha de creación: {self.creado or '(no informada)'}",
            f"- Plan_ofrecido: {self.plan_ofrecido or '(no informado)'}",
            f"- Precio_ofrecido: {self.precio_ofrecido}",
            f"- Plan_retencion: {self.plan_retencion or '(no informado)'}",            
            f"- Monto_asegurado: {self.monto_asegurado}",
        ]
        return "\n".join(lines)