import sqlite3
from pathlib import Path
from datetime import datetime, timezone

DB = Path("/var/lib/hermes-nexus/memory.db")

def conectar():
    conexion = sqlite3.connect(str(DB), timeout=10)
    conexion.execute("PRAGMA busy_timeout=10000")
    conexion.execute("""
        CREATE TABLE IF NOT EXISTS hermes_conversaciones (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            usuario TEXT NOT NULL,
            conversacion TEXT NOT NULL,
            rol TEXT NOT NULL CHECK(rol IN ('user','model')),
            contenido TEXT NOT NULL,
            fecha TEXT NOT NULL
        )
    """)
    conexion.execute("""
        CREATE INDEX IF NOT EXISTS idx_historial
        ON hermes_conversaciones(usuario, conversacion, id)
    """)
    conexion.execute("""
        CREATE TABLE IF NOT EXISTS hermes_preferencias (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            usuario TEXT NOT NULL,
            instruccion TEXT NOT NULL,
            fecha TEXT NOT NULL,
            UNIQUE(usuario, instruccion)
        )
    """)
    return conexion

def guardar(usuario, conversacion, rol, contenido):
    if rol not in ("user", "model"):
        raise ValueError("Rol no permitido")

    with conectar() as db:
        db.execute("""
            INSERT INTO hermes_conversaciones
            (usuario, conversacion, rol, contenido, fecha)
            VALUES (?, ?, ?, ?, ?)
        """, (
            usuario,
            conversacion,
            rol,
            contenido,
            datetime.now(timezone.utc).isoformat()
        ))

def historial(usuario, conversacion, limite=12):
    limite = max(1, min(int(limite), 30))

    with conectar() as db:
        filas = db.execute("""
            SELECT rol, contenido
            FROM hermes_conversaciones
            WHERE usuario=? AND conversacion=?
            ORDER BY id DESC
            LIMIT ?
        """, (usuario, conversacion, limite)).fetchall()

    return [
        {"role": rol, "parts": [{"text": contenido}]}
        for rol, contenido in reversed(filas)
    ]


def recordar(usuario, instruccion):
    instruccion = " ".join(instruccion.strip().split())
    if not (3 <= len(instruccion) <= 400):
        raise ValueError("La instrucción debe tener entre 3 y 400 caracteres")
    with conectar() as db:
        db.execute("""
            INSERT OR IGNORE INTO hermes_preferencias(usuario, instruccion, fecha)
            VALUES (?, ?, ?)
        """, (usuario, instruccion, datetime.now(timezone.utc).isoformat()))
    return instruccion


def preferencias(usuario, limite=100):
    with conectar() as db:
        filas = db.execute("""
            SELECT instruccion FROM hermes_preferencias
            WHERE usuario=? ORDER BY id DESC LIMIT ?
        """, (usuario, max(1, min(int(limite), 100)))).fetchall()
    return [fila[0] for fila in reversed(filas)]
