"""
Tool 0 — Requête SQL sur la base DVF (MySQL).
Exécute une requête SELECT sur la base de données MySQL immobilier.
"""

from __future__ import annotations

import logging
import re

import pymysql

from domain.core.security import InputSecurityError, valider_sql
from domain.db import get_db

logger = logging.getLogger("tools.query_db")


def query_db(sql: str) -> list | dict:
    """
    Exécute une requête SQL SELECT et retourne les résultats.
    Bloque toute requête qui n'est pas un SELECT et valide les patterns dangereux.

    Args:
        sql: Requête SQL SELECT uniquement.

    Returns:
        list[dict] : résultats sous forme de liste de dictionnaires.
        dict       : {"erreur": "message"} en cas de problème.
    """
    logger.info("Requête SQL : %s", sql)

    if not sql.strip().upper().startswith("SELECT"):
        logger.warning("Requête non-SELECT bloquée : %s", sql[:80])
        return {"erreur": "Seules les requêtes SELECT sont autorisées."}

    try:
        valider_sql(sql)
    except InputSecurityError as exc:
        logger.warning("[SECURITY] Requête SQL rejetée : %s", exc)
        return {"erreur": str(exc)}

    if not re.search(r"\bLIMIT\b", sql, re.IGNORECASE):
        sql = sql.rstrip().rstrip(";") + " LIMIT 20"
        logger.debug("LIMIT 20 ajouté automatiquement.")

    try:
        with get_db() as conn:
            proxy = conn.execute(sql)
            results = proxy.fetchall()
        logger.info("Résultats : %d lignes", len(results))
        return results  # DictCursor already returns list[dict]
    except pymysql.Error as exc:
        logger.error("Erreur SQL : %s", exc)
        return {"erreur": f"Erreur SQL : {exc}"}
