import os
from dotenv import load_dotenv
import psycopg2
import json
from psycopg2.extras import Json
import asyncio
# Cargar .env
load_dotenv()

# Acceder a las variables
DB_HOST = os.getenv("DB_HOST")
DB_PORT = os.getenv("DB_PORT")
DB_NAME = os.getenv("DB_NAME")
DB_USER = os.getenv("DB_USER")
DB_PASSWORD = os.getenv("DB_PASSWORD")


def obtener_conexion():
    try:
        conn = psycopg2.connect(
            host=os.getenv("DB_HOST"),
            port=os.getenv("DB_PORT"),
            dbname=os.getenv(
                "DB_NAME"
            ),  # Nota: se conecta a DB_NAME (generalmente 'postgres')
            user=os.getenv("DB_USER"),
            password=os.getenv("DB_PASSWORD"),
        )
        # Establecer esquema por defecto
        with conn.cursor() as cursor:
            cursor.execute(f"SET search_path TO {os.getenv('CURRENT_SCHEMA')};")
        return conn
    except Exception as e:
        print("Error en la conexión:", e)
        return None


def ejecutar_consulta(sql: str, params=None):
    conn = obtener_conexion()
    if not conn:
        return None
    try:
        with conn.cursor() as cursor:
            cursor.execute(sql, params)  # Aquí `sql` debe ser un string
            if cursor.description:
                return cursor.fetchall()
            conn.commit()
    except Exception as e:
        print("Error al ejecutar consulta:", e)
    finally:
        conn.close()


def insertar_auditoria(data: dict):
    sql = """
    INSERT INTO auditoria (
        ip_cliente, metodo_http, url, headers, cuerpo, usuario, estado_respuesta, mensaje
    )
    VALUES (%s, %s, %s, %s, %s, %s, %s, %s);
    """
    params = (
        data.get("ip_cliente"),
        data.get("metodo_http"),
        data.get("url"),
        json.dumps(data.get("headers")),  # ✅ ¡Aquí convertimos el dict en string JSON!
        data.get("cuerpo"),
        data.get("usuario"),
        data.get("estado_respuesta"),
        data.get("mensaje"),
    )
    ejecutar_consulta(sql, params)

async def insertar_consumo_tokens(data: dict) -> int:
    loop = asyncio.get_running_loop()
    def _insert():
        conn = obtener_conexion()
        cursor = conn.cursor()
        cursor.execute("""
            INSERT INTO face_recognition.consumo_tokens (
                modelo, tokens_utilizados, costo_aproximado, cedula, endpoint, respuesta_modelo
            ) VALUES (%s, %s, %s, %s, %s, %s)
            RETURNING id;
        """, (
            data.get("modelo"),
            data.get("tokens_utilizados"),
            data.get("costo_aproximado"),
            data.get("cedula"),
            data.get("endpoint"),
            Json(data.get("respuesta_modelo"))
        ))
        consumo_id = cursor.fetchone()[0]
        conn.commit()
        conn.close()
        return consumo_id

    return await loop.run_in_executor(None, _insert)

async def insertar_resultado_prueba_vida(data: dict, consumo_id: int):
    loop = asyncio.get_running_loop()
    def _insert():
        conn = obtener_conexion()
        cursor = conn.cursor()
        cursor.execute("""
            INSERT INTO face_recognition.resultado_prueba_vida (
                cedula, video_base64, resultado_json, estado, tipo_error, consumo_tokens_id
            ) VALUES (%s, %s, %s, %s, %s, %s);
        """, (
            data.get("cedula"),
            data.get("video_base64"),
            Json(data.get("resultado_json")),
            data.get("estado"),
            data.get("tipo_error"),
            consumo_id
        ))
        conn.commit()
        conn.close()
    await loop.run_in_executor(None, _insert)