"""Router de agentes especializados.

Clasifica la intención del texto entrante y devuelve el agente más adecuado
con su prompt de sistema listo para enviar al proveedor LLM. No requiere
llamada LLM para el routing; usa detección de palabras clave eficiente.
"""
from __future__ import annotations

from enum import Enum
from typing import Any

from .config import get_settings


class AgentKind(str, Enum):
    OPS = "ops"
    MARKETING = "marketing"
    SEO = "seo"
    CODE = "code"
    SECURITY = "security"
    GENERAL = "general"


# Metadatos de cada agente: nombre, icono, descripción y palabras clave de routing
AGENT_REGISTRY: dict[AgentKind, dict[str, Any]] = {
    AgentKind.OPS: {
        "name": "OpsAgent",
        "icon": "⚙️",
        "description": "Operaciones: SSH, git, despliegue, logs, OPcache, PHP",
        "keywords": [
            "git", "deploy", "desplegar", "despliegue", "logs", "cache", "opcache",
            "ssh", "php lint", "phpstan", "psalm", "servidor", "errores php",
            "php error", "publish", "publicar", "actualiza producción",
        ],
    },
    AgentKind.MARKETING: {
        "name": "MarketingAgent",
        "icon": "📣",
        "description": "Marketing: campañas WhatsApp/email, CRM, anunciantes, outreach",
        "keywords": [
            "campaña", "campana", "whatsapp", "marketing", "anunciante", "captación",
            "captacion", "leads", "crm", "reactivar", "reactivación", "email",
            "copy", "oferta", "telegram marketing", "outreach", "segmentación",
        ],
    },
    AgentKind.SEO: {
        "name": "SeoAgent",
        "icon": "🔍",
        "description": "SEO, UX, rendimiento, posicionamiento, Core Web Vitals",
        "keywords": [
            "seo", "posicionamiento", "url", "rendimiento", "performance", "ux",
            "usabilidad", "analytics", "google", "indexar", "core web", "page speed",
            "lighthouse", "sitemap", "meta", "canonical", "schema", "serp",
        ],
    },
    AgentKind.CODE: {
        "name": "CodeAgent",
        "icon": "💻",
        "description": "Revisión código, bugs, refactor, PHP, JavaScript, CSS",
        "keywords": [
            "código", "codigo", "bug", "refactor", "función", "funcion", "clase",
            "javascript", "css", "arregla", "corrige el código", "syntax error",
            "exception", "undefined", "null pointer", "review código", "fix",
        ],
    },
    AgentKind.SECURITY: {
        "name": "SecurityAgent",
        "icon": "🔒",
        "description": "Seguridad: OWASP, permisos, XSS, SQL injection, headers",
        "keywords": [
            "seguridad", "security", "xss", "sql injection", "injection", "permiso",
            "cors", "header", "vulnerabilidad", "brecha", "autenticacion",
            "autenticación", "csrf", "pentest", "hardening", "firewall", "owasp",
        ],
    },
}


def route_to_agent(text: str) -> AgentKind:
    """Clasifica el texto en el agente más adecuado por conteo de keywords."""
    lower = text.lower()
    scores: dict[AgentKind, int] = {kind: 0 for kind in AgentKind}
    for kind, meta in AGENT_REGISTRY.items():
        for kw in meta["keywords"]:
            if kw in lower:
                scores[kind] += 1
    best = max(scores, key=lambda k: scores[k])
    return best if scores[best] > 0 else AgentKind.GENERAL


def get_agent_system_prompt(kind: AgentKind) -> str:
    """Devuelve el system prompt especializado para cada tipo de agente.
    
    Usa PROJECT_NAME y PROJECT_DESCRIPTION del entorno para que el supervisor
    sea reutilizable en cualquier proyecto sin modificar código.
    """
    s = get_settings()
    base = (
        f"Eres un agente de IA autónomo experto integrado en el supervisor de operaciones de '{s.project_name}'. "
        f"{s.project_description} "
        "\n\n"
        "IDIOMA: Responde SIEMPRE en español. Nunca respondas en inglés aunque la pregunta sea en inglés.\n\n"
        "RAZONAMIENTO: Antes de responder, razona internamente paso a paso (chain-of-thought). "
        "Tu respuesta final debe ser estructurada, coherente y accionable. "
        "No incluyas el razonamiento interno en la respuesta, solo las conclusiones y propuestas.\n\n"
        "FORMATO DE RESPUESTA:\n"
        "1. **Análisis** — qué observas y por qué es relevante\n"
        "2. **Propuestas** — acciones concretas, cada una con: qué hacer / por qué / riesgo (low·medium·high)\n"
        "3. **Prioridad** — ordena las propuestas de mayor a menor impacto\n\n"
        "PRINCIPIOS:\n"
        "- Sé directo y específico. Evita vaguedades.\n"
        "- Si no tienes información suficiente, di exactamente qué datos necesitas.\n"
        "- Marca cada propuesta como ejecutable via SSH si aplica.\n"
        "- Obedece las instrucciones del operador. Si pide algo peligroso, adviértelo pero propón la alternativa más segura."
    )
    specializations = {
        AgentKind.OPS: (
            "Tu especialidad es operaciones de servidor: SSH, git, despliegue PHP, "
            "logs de error, OPcache, Composer y herramientas de análisis estático. "
            "Prioriza operaciones de solo lectura; marca como riesgo alto cualquier cambio destructivo. "
            "Sugiere comandos SSH concretos cuando sea útil."
        ),
        AgentKind.MARKETING: (
            "Tu especialidad es marketing digital para directorios adultos: "
            "campañas WhatsApp Business, segmentación de anunciantes, copywriting persuasivo, "
            "CRM, email marketing y estrategias de reactivación y captación. "
            "Siempre incluye métricas esperadas y riesgos legales/reputacionales."
        ),
        AgentKind.SEO: (
            "Tu especialidad es SEO técnico y UX para portales web: "
            "Core Web Vitals, posicionamiento local España, estructura de URLs, "
            "schema markup, rendimiento y accesibilidad. "
            "Prioriza cambios de mayor impacto con menor riesgo de penalización."
        ),
        AgentKind.CODE: (
            "Tu especialidad es revisión y corrección de código: PHP 8.x, "
            "JavaScript moderno (ES2022+), CSS, SQL y arquitectura web. "
            "Proporciona código concreto cuando sea posible, con explicación del impacto "
            "y backward-compatibility. Sigue PSR-12 para PHP."
        ),
        AgentKind.SECURITY: (
            "Tu especialidad es seguridad según OWASP Top 10: "
            "XSS, SQL Injection, CSRF, CORS, autenticación, gestión de sesiones, "
            "headers HTTP y hardening de servidores PHP/Apache/Nginx. "
            "Prioriza por criticidad: critical > high > medium > low."
        ),
        AgentKind.GENERAL: (
            "Eres un agente generalista que puede ayudar con cualquier aspecto "
            "del proyecto: operaciones, marketing, SEO, código o seguridad."
        ),
    }
    return f"{base}\n\n{specializations.get(kind, specializations[AgentKind.GENERAL])}"


def agent_label(kind: AgentKind) -> str:
    meta = AGENT_REGISTRY.get(kind)
    if meta:
        return f"{meta['icon']} {meta['name']}"
    return "🤖 GeneralAgent"


def all_agents_summary() -> list[dict[str, str]]:
    result = []
    for kind, meta in AGENT_REGISTRY.items():
        result.append({
            "key": kind.value,
            "name": meta["name"],
            "icon": meta["icon"],
            "description": meta["description"],
        })
    return result
