"""
Servidor MCP de expedientes.

Es el MISMO tool de 07_expedientes.py, pero expuesto por el protocolo MCP en
lugar de hardcodeado dentro del agente. Comparación directa:

  07 (no-MCP):  el dict TOOLS y FUNCIONES viven DENTRO del agente.
  MCP:          las tools viven AQUÍ, en un proceso aparte. El agente las
                descubre por el protocolo (tools/list) y las ejecuta (tools/call).

Lo notable: aquí NO se escribe ningún esquema JSON a mano. FastMCP lo genera
solo, a partir de los type hints (incluido el Literal -> enum) y del docstring
de cada función. Compáralo con el TOOLS escrito a mano de 07.

Este servidor no se ejecuta directamente: lo lanza el cliente (08_cliente_mcp.py)
como subproceso y habla con él por stdin/stdout (transporte stdio).
"""

import sqlite3
from pathlib import Path
from typing import Literal

from mcp.server.fastmcp import FastMCP

DB = Path(__file__).parent / "expedientes.db"

mcp = FastMCP("expedientes")


def _conectar():
    con = sqlite3.connect(DB)
    con.row_factory = sqlite3.Row
    return con


@mcp.tool()
def buscar_expedientes(
    estado: Literal["abierto", "en_tramite", "cerrado", "archivado"] | None = None,
    tipo: Literal["inspeccion", "licencia", "incidente", "sancion"] | None = None,
    anio: int | None = None,
    responsable: str | None = None,
    limite: int = 10,
) -> str:
    """Busca expedientes en la base de datos aplicando filtros opcionales
    (estado, tipo, año de apertura, responsable). Devuelve una lista resumida.
    Úsala para preguntas como 'expedientes abiertos de 2025' o 'inspecciones de Marta'."""
    sql = ("SELECT codigo, titulo, tipo, estado, fecha_apertura, responsable, "
           "instalacion FROM expedientes WHERE 1=1")
    params = []
    if estado:
        sql += " AND estado = ?"; params.append(estado)
    if tipo:
        sql += " AND tipo = ?"; params.append(tipo)
    if anio:
        sql += " AND fecha_apertura LIKE ?"; params.append(f"{anio}-%")
    if responsable:
        sql += " AND responsable LIKE ?"; params.append(f"%{responsable}%")
    sql += " ORDER BY fecha_apertura DESC LIMIT ?"; params.append(min(int(limite), 50))

    con = _conectar()
    filas = con.execute(sql, params).fetchall()
    con.close()
    if not filas:
        return "No se encontraron expedientes con esos criterios."
    return "\n".join(
        f"{f['codigo']} | {f['estado']} | {f['tipo']} | {f['fecha_apertura']} | "
        f"{f['responsable']} | {f['instalacion']} | {f['titulo']}"
        for f in filas
    )


@mcp.tool()
def detalle_expediente(codigo: str) -> str:
    """Devuelve TODOS los datos de un expediente concreto a partir de su código
    (ej. 'EXP-2025-008'). Úsala cuando ya conoces el código y quieres el detalle."""
    import json
    con = _conectar()
    f = con.execute("SELECT * FROM expedientes WHERE codigo = ?", [codigo]).fetchone()
    con.close()
    if not f:
        return f"No existe el expediente {codigo}."
    return json.dumps(dict(f), ensure_ascii=False, indent=2)


if __name__ == "__main__":
    mcp.run()  # transporte stdio por defecto
