from __future__ import annotations

from enum import Enum
from typing import Any

from pydantic import BaseModel, Field


class ProposalStatus(str, Enum):
    pending = "pending"
    approved = "approved"
    rejected = "rejected"
    executed = "executed"
    failed = "failed"


class RiskLevel(str, Enum):
    low = "low"
    medium = "medium"
    high = "high"


class CommandRequest(BaseModel):
    text: str = Field(..., min_length=3, description="Orden natural dada por el operador")
    actor: str = Field(default="propietario")
    channel: str = Field(default="dashboard")


class ProposalDecision(BaseModel):
    actor: str = Field(default="propietario")
    note: str | None = Field(default=None)


class MemoryPromotion(BaseModel):
    actor: str = Field(default="propietario")
    note: str | None = Field(default=None)


class AutomationRuleToggleRequest(BaseModel):
    actor: str = Field(default="propietario")
    enabled: bool = Field(...)
    note: str | None = Field(default=None)


class AutomationRuleRunRequest(BaseModel):
    actor: str = Field(default="propietario")
    note: str | None = Field(default=None)


class ChatbotConsentCreateRequest(BaseModel):
    actor: str = Field(default="propietario")
    phone: str = Field(..., min_length=5)
    name: str | None = Field(default=None)
    advertiser_id: int | None = Field(default=None, gt=0)
    source: str = Field(default="supervisor")
    proof: str | None = Field(default=None)


class WhatsAppCampaignTarget(BaseModel):
    phone: str = Field(..., min_length=5)
    name: str | None = Field(default=None)
    custom_fields: dict[str, Any] = Field(default_factory=dict)
    message_text: str | None = Field(default=None)


class WhatsAppCampaignCreateRequest(BaseModel):
    actor: str = Field(default="propietario")
    advertiser_id: int = Field(..., gt=0)
    name: str = Field(..., min_length=3)
    message_template: str = Field(..., min_length=3)
    description: str | None = Field(default=None)
    scheduled_at: str | None = Field(default=None)
    use_ai_personalization: bool = Field(default=False)
    targets: list[WhatsAppCampaignTarget] = Field(default_factory=list)


class WhatsAppCampaignSendRequest(BaseModel):
    actor: str = Field(default="propietario")
    immediate: bool = Field(default=True)
    source: str | None = Field(default="marketing")


class EventInboundRequest(BaseModel):
    """Evento enviado desde el portal PHP al supervisor."""
    event_type: str = Field(..., min_length=3, description="Tipo de evento: nueva_alta, error_critico, campana_finalizada, etc.")
    source: str = Field(default="portal_php", description="Origen del evento")
    payload: dict[str, Any] = Field(default_factory=dict, description="Datos del evento")
    auto_study: bool = Field(default=False, description="Si es True, genera un estudio automáticamente")


class AgentChatRequest(BaseModel):
    """Petición de chat directo al agente desde el dashboard."""
    text: str = Field(..., min_length=3)
    agent_kind: str = Field(default="general", description="ops|marketing|seo|code|security|general")
    actor: str = Field(default="dashboard")


class DigestRequest(BaseModel):
    actor: str = Field(default="propietario")
    hours: int = Field(default=24, ge=1, le=168)

    note: str | None = Field(default=None)


class AnalyticsTrackRequest(BaseModel):
    """Evento de análitica enviado desde el portal o dashboard."""
    event_type: str = Field(..., min_length=1, max_length=64, description="pageview|click|interaction|form_submit|api_call|error")
    page: str = Field(default="", description="URL path o nombre del módulo")
    source: str = Field(default="portal", description="portal|dashboard|api|telegram")
    actor: str = Field(default="anonymous", description="Usuario o 'anonymous'")
    meta: dict[str, Any] = Field(default_factory=dict, description="Datos extra del evento")


class StudyRecord(BaseModel):
    id: str
    request_text: str
    summary: str
    analysis: str
    recommended_agents: list[str]
    actor: str
    channel: str
    created_at: str


class ProposalRecord(BaseModel):
    id: str
    study_id: str
    agent_name: str
    title: str
    summary: str
    action_type: str
    payload: dict[str, Any]
    risk_level: RiskLevel
    status: ProposalStatus
    created_at: str
    decided_at: str | None = None
    decided_by: str | None = None
    decision_note: str | None = None
    execution_log: str | None = None


class MemoryRecord(BaseModel):
    id: int
    study_id: str
    subject: str
    note: str
    actor: str
    created_at: str


class CommandResponse(BaseModel):
    study: StudyRecord
    proposals: list[ProposalRecord]


class StatusResponse(BaseModel):
    settings: dict[str, Any]
    counts: dict[str, int]
    allowed_commands: dict[str, Any]


class MemoryImportRequest(BaseModel):
    """Payload para importar aprendizaje exportado de otra instancia del supervisor."""
    version: int = Field(default=1)
    memories: list[dict[str, Any]] = Field(default_factory=list)
    training_feedback: list[dict[str, Any]] = Field(default_factory=list)
    actor: str = Field(default="import", description="Identificador del origen de la importación")
