# agent/tools.py — Herramientas del agente Eflexi
# Generado por AgentKit

import os
import yaml
import logging
from datetime import datetime

logger = logging.getLogger("agentkit")


def cargar_info_negocio() -> dict:
    """Carga la información del negocio desde business.yaml."""
    try:
        with open("config/business.yaml", "r", encoding="utf-8") as f:
            return yaml.safe_load(f)
    except FileNotFoundError:
        logger.error("config/business.yaml no encontrado")
        return {}


def obtener_info_plataforma() -> dict:
    """Retorna información básica de Efletexia."""
    info = cargar_info_negocio()
    return {
        "nombre": info.get("negocio", {}).get("nombre", "Efletexia"),
        "horario": info.get("negocio", {}).get("horario", "24/7"),
        "paises": info.get("negocio", {}).get("paises", ["Perú", "México", "Colombia"]),
        "segmentos": info.get("segmentos", []),
    }


def buscar_en_knowledge(consulta: str) -> str:
    """Busca información relevante en los archivos de /knowledge."""
    resultados = []
    knowledge_dir = "knowledge"

    if not os.path.exists(knowledge_dir):
        return "No hay archivos de conocimiento disponibles."

    for archivo in os.listdir(knowledge_dir):
        ruta = os.path.join(knowledge_dir, archivo)
        if archivo.startswith(".") or not os.path.isfile(ruta):
            continue
        try:
            with open(ruta, "r", encoding="utf-8") as f:
                contenido = f.read()
                if consulta.lower() in contenido.lower():
                    resultados.append(f"[{archivo}]: {contenido[:500]}")
        except (UnicodeDecodeError, IOError):
            continue

    if resultados:
        return "\n---\n".join(resultados)
    return "No encontré información específica sobre eso en mis archivos."


# ── Calificación de leads ────────────────────────────────────

def calificar_lead(segmento: str, pais: str, necesidad: str) -> dict:
    """
    Registra y califica un lead entrante.

    Args:
        segmento: Tipo de usuario (comisionista, conductor, emprendedor, empresa, generador)
        pais: País del lead (Perú, México, Colombia)
        necesidad: Descripción breve de lo que busca

    Returns:
        Diccionario con calificación y próximo paso recomendado
    """
    segmentos_validos = ["comisionista", "conductor", "emprendedor", "empresa", "generador"]
    paises_validos = ["peru", "perú", "mexico", "méxico", "colombia"]

    score = 0
    if segmento.lower() in segmentos_validos:
        score += 50
    if pais.lower() in paises_validos:
        score += 30
    if len(necesidad) > 20:
        score += 20

    return {
        "segmento": segmento,
        "pais": pais,
        "necesidad": necesidad,
        "score": score,
        "calificacion": "alto" if score >= 80 else "medio" if score >= 50 else "bajo",
        "siguiente_paso": "Conectar con equipo comercial" if score >= 80 else "Enviar información de registro",
        "timestamp": datetime.utcnow().isoformat(),
    }


# ── Solicitudes de carga ─────────────────────────────────────

def registrar_solicitud_carga(
    telefono: str,
    origen: str,
    destino: str,
    tipo_carga: str,
    fecha: str,
    descripcion: str = ""
) -> dict:
    """
    Registra una solicitud de transporte de carga.

    Args:
        telefono: Número del solicitante
        origen: Ciudad/punto de origen
        destino: Ciudad/punto de destino
        tipo_carga: Descripción del tipo de mercancía
        fecha: Fecha requerida para el traslado
        descripcion: Detalles adicionales (peso, volumen, requisitos especiales)

    Returns:
        Confirmación con ID de solicitud
    """
    solicitud_id = f"SOL-{datetime.utcnow().strftime('%Y%m%d%H%M%S')}-{telefono[-4:]}"

    logger.info(f"Nueva solicitud de carga: {solicitud_id} | {origen} → {destino} | {tipo_carga}")

    return {
        "id": solicitud_id,
        "telefono": telefono,
        "origen": origen,
        "destino": destino,
        "tipo_carga": tipo_carga,
        "fecha_requerida": fecha,
        "descripcion": descripcion,
        "estado": "recibida",
        "timestamp": datetime.utcnow().isoformat(),
        "mensaje": f"Solicitud {solicitud_id} registrada. Nuestro equipo se comunicará contigo a la brevedad para coordinar el transporte.",
    }


# ── Soporte post-venta ───────────────────────────────────────

def crear_ticket_soporte(telefono: str, problema: str, categoria: str = "general") -> dict:
    """
    Crea un ticket de soporte para un usuario existente.

    Args:
        telefono: Número del usuario
        problema: Descripción del problema o consulta
        categoria: Tipo de soporte (técnico, facturación, operativo, general)

    Returns:
        Ticket creado con ID para seguimiento
    """
    ticket_id = f"TKT-{datetime.utcnow().strftime('%Y%m%d%H%M%S')}"

    categorias_urgentes = ["técnico", "tecnico", "operativo"]
    prioridad = "alta" if categoria.lower() in categorias_urgentes else "normal"

    logger.info(f"Nuevo ticket de soporte: {ticket_id} | {categoria} | {prioridad}")

    return {
        "id": ticket_id,
        "telefono": telefono,
        "problema": problema,
        "categoria": categoria,
        "prioridad": prioridad,
        "estado": "abierto",
        "timestamp": datetime.utcnow().isoformat(),
        "mensaje": f"Ticket {ticket_id} creado con prioridad {prioridad}. Te contactaremos pronto.",
    }


def escalar_a_equipo(telefono: str, contexto: str, tipo: str = "comercial") -> dict:
    """
    Escala una conversación al equipo humano correspondiente.

    Args:
        telefono: Número del usuario
        contexto: Resumen de la conversación para el equipo
        tipo: Tipo de equipo al que escalar (comercial, soporte, operaciones)

    Returns:
        Confirmación de escalamiento
    """
    logger.info(f"Escalamiento a equipo {tipo}: {telefono}")

    return {
        "escalado_a": tipo,
        "telefono": telefono,
        "contexto": contexto,
        "timestamp": datetime.utcnow().isoformat(),
        "mensaje": f"Tu consulta ha sido derivada a nuestro equipo de {tipo}. Te contactarán en breve.",
    }
