# agent/tools.py — Outils spécifiques à Welely
# Généré par AgentKit

import os
import yaml
import logging
from datetime import datetime

logger = logging.getLogger("agentkit")


def cargar_info_negocio() -> dict:
    """Charge les informations du business depuis 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 non trouvé")
        return {}


def obtener_horario() -> dict:
    """Retourne les horaires d'ouverture de Welely."""
    info = cargar_info_negocio()
    return {
        "horario": info.get("negocio", {}).get("horario", "Non disponible"),
        "esta_abierto": _esta_en_horario(),
    }


def _esta_en_horario() -> bool:
    """Vérifie si on est dans les horaires d'ouverture."""
    now = datetime.now()
    jour = now.weekday()  # 0=Lundi, 6=Dimanche
    heure = now.hour + now.minute / 60

    if jour < 5:  # Lundi–Vendredi
        return 8 <= heure < 18
    elif jour == 5:  # Samedi
        return 9 <= heure < 14
    return False  # Dimanche


def obtener_ofertas() -> list[dict]:
    """Retourne la liste des offres packagées de Welely."""
    info = cargar_info_negocio()
    return info.get("ofertas", [])


def obtener_info_gestionstock() -> dict:
    """Retourne toutes les informations sur GestionStock."""
    info = cargar_info_negocio()
    return info.get("gestionstock", {})


# ── Qualification de leads ──────────────────────────────────

def registrar_lead(telefono: str, nombre: str, interes: str, presupuesto: str = "") -> dict:
    """
    Enregistre un nouveau lead qualifié.
    Dans une version production, ceci s'enverrait vers un CRM (Notion, HubSpot, etc.)
    """
    lead = {
        "telefono": telefono,
        "nombre": nombre,
        "interes": interes,
        "presupuesto": presupuesto,
        "fecha": datetime.now().isoformat(),
        "estado": "nuevo",
    }
    logger.info(f"Nouveau lead enregistré : {lead}")
    # TODO en production : envoyer vers CRM ou base de données
    return lead


def calificar_lead(interes: str, presupuesto: str) -> str:
    """
    Qualifie un lead selon son intérêt et son budget.
    Retourne : "chaud", "tiede" ou "froid"
    """
    interes_lower = interes.lower()
    mots_chauds = ["maintenant", "urgent", "cette semaine", "ce mois", "dès que possible", "asap"]
    mots_froids = ["plus tard", "juste curiosité", "pas de budget", "voir", "réfléchir"]

    if any(mot in interes_lower for mot in mots_chauds):
        return "chaud"
    if any(mot in interes_lower for mot in mots_froids):
        return "froid"
    return "tiede"


# ── Demandes de devis / rendez-vous ────────────────────────

def registrar_solicitud_cotizacion(
    telefono: str,
    servicio: str,
    descripcion: str,
    nombre: str = "",
) -> dict:
    """Enregistre une demande de devis."""
    solicitud = {
        "telefono": telefono,
        "nombre": nombre,
        "servicio": servicio,
        "descripcion": descripcion,
        "fecha": datetime.now().isoformat(),
        "estado": "en_attente",
    }
    logger.info(f"Demande de devis : {solicitud}")
    # TODO en production : notifier l'équipe Welely (email, Slack, etc.)
    return solicitud


def registrar_cita(
    telefono: str,
    nombre: str,
    fecha_preferida: str,
    motivo: str,
) -> dict:
    """Enregistre une demande de rendez-vous."""
    cita = {
        "telefono": telefono,
        "nombre": nombre,
        "fecha_preferida": fecha_preferida,
        "motivo": motivo,
        "fecha_solicitud": datetime.now().isoformat(),
        "estado": "a_confirmer",
    }
    logger.info(f"Rendez-vous demandé : {cita}")
    # TODO en production : synchroniser avec Google Calendar ou Calendly
    return cita


# ── Recherche dans /knowledge ───────────────────────────────

def buscar_en_knowledge(consulta: str) -> str:
    """
    Recherche des informations pertinentes dans les fichiers /knowledge.
    Retourne le contenu le plus pertinent trouvé.
    """
    resultados = []
    knowledge_dir = "knowledge"

    if not os.path.exists(knowledge_dir):
        return "Aucun fichier de connaissance disponible."

    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 "Je n'ai pas trouvé d'information spécifique sur ce sujet dans mes fichiers."
