import "dotenv/config";
import express from "express";
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";

const PORT = Number(process.env.PORT || 3001);
const PHP_ENDPOINT_BASE = process.env.PHP_ENDPOINT_BASE;
const PHP_ENDPOINT_KEY = process.env.PHP_ENDPOINT_KEY;

if (!PHP_ENDPOINT_BASE || !PHP_ENDPOINT_KEY) {
  throw new Error("Missing PHP_ENDPOINT_BASE or PHP_ENDPOINT_KEY in environment");
}

function buildPhpUrl(params: Record<string, string>) {
  const url = new URL(PHP_ENDPOINT_BASE);
  url.searchParams.set("key", PHP_ENDPOINT_KEY);
  for (const [k, v] of Object.entries(params)) {
    url.searchParams.set(k, v);
  }
  return url.toString();
}

async function callPhp(params: Record<string, string>) {
  const url = buildPhpUrl(params);
  const res = await fetch(url, {
    method: "GET",
    headers: { "Accept": "application/json" }
  });

  const text = await res.text();
  let data: unknown = text;
  try {
    data = JSON.parse(text);
  } catch {
    // keep raw text
  }

  if (!res.ok) {
    throw new Error(typeof data === "string" ? data : JSON.stringify(data));
  }

  return data;
}

function createServer() {
  const server = new McpServer({
    name: "claude-dropbox-finance",
    version: "1.0.0"
  });

  server.tool(
    "list_folder",
    {
      path: z.string().default("")
    },
    async ({ path }) => {
      const data = await callPhp({
        action: "list",
        path
      });

      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(data, null, 2)
          }
        ]
      };
    }
  );

  server.tool(
    "read_excel",
    {
      path: z.string()
    },
    async ({ path }) => {
      const data = await callPhp({
        action: "read_excel",
        path
      });

      return {
        content: [
          {
            type: "text",
            text: JSON.stringify(data, null, 2)
          }
        ]
      };
    }
  );

  return server;
}

const app = express();
app.use(express.json());

app.post("/mcp", async (req, res) => {
  const transport = new StreamableHTTPServerTransport({
    sessionIdGenerator: undefined
  });

  const server = createServer();
  await server.connect(transport);
  await transport.handleRequest(req, res, req.body);
});

app.get("/health", (_req, res) => {
  res.json({ ok: true });
});

app.listen(PORT, "0.0.0.0", () => {
  console.log(`MCP server listening on ${PORT}`);
});