/**
 * Project Caffeine v0.0.3
 * Copyright (c) 2025-2026 Gitconomy Research
 *
 * SPDX-License-Identifier: MIT
 *
 * Contributors:
 * - 郭晧 <guohao@gitconomy.org> (Initial Author)
 */

import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
import { handleToolCall } from './controllers/toolsController';
import { listObsidianNotes, readObsidianNote } from './services/resourceService';

const server = new McpServer({
  name: 'Project-Caffeine-Arabica-Intent-Mode',
  version: '0.0.3'
});

/**
 * 注册文献搜索工具 (search_arxiv)
 * 用于通过 arXiv API 检索相关学术文献。
 */
server.tool(
  'search_arxiv',
  { query: z.string().describe('需要检索的学术核心关键字') },
  async (args) => {
    const result = await handleToolCall('search_arxiv', args);
    return { isError: result.isError, content: result.content.map((item: any) => ({ type: "text" as const, text: item.text })) };
  }
);

/**
 * 注册框架模板获取工具 (fetch_framework_template)
 * 用于获取指定的经典思维框架模板（如 swot, scqa 等）。
 */
server.tool(
  'fetch_framework_template',
  { framework_name: z.string().describe('框架名称，必须是 swot, scqa, pestle, 5w3h, 5whys 之一') },
  async (args) => {
    const result = await handleToolCall('fetch_framework_template', args);
    return { isError: result.isError, content: result.content.map((item: any) => ({ type: "text" as const, text: item.text })) };
  }
);

/**
 * 注册保存笔记工具 (save_note)
 * 用于将分析结果或文献内容保存到本地知识库中。
 */
server.tool(
  'save_note',
  {
    filename: z.string().describe('生成的文件名，必须以 .md 结尾'),
    content: z.any().describe('需要保存的完整内容文本，支持传入JSON对象。')
  },
  async (args) => {
    const result = await handleToolCall('save_note', args);
    return { isError: result.isError, content: result.content.map((item: any) => ({ type: "text" as const, text: item.text })) };
  }
);

/**
 * 注册列出本地笔记工具 (list_local_notes)
 * 用于扫描并返回本地知识库中所有 Markdown 格式的笔记文件名。
 */
server.tool(
  'list_local_notes',
  {},
  async (args) => {
    const result = await handleToolCall('list_local_notes', args);
    return { isError: result.isError, content: result.content.map((item: any) => ({ type: "text" as const, text: item.text })) };
  }
);

/**
 * 注册读取本地笔记工具 (read_local_note)
 * 用于读取指定的本地 Markdown 笔记内容。
 */
server.tool(
  'read_local_note',
  { filename: z.string().describe('需要读取的笔记文件名，必须包含 .md 后缀') },
  async (args) => {
    const result = await handleToolCall('read_local_note', args);
    return { isError: result.isError, content: result.content.map((item: any) => ({ type: "text" as const, text: item.text })) };
  }
);

// ==========================================
// 注册资源（Resources）保持 UI 附件功能
// ==========================================

/**
 * 注册本地笔记资源 (local-notes)
 * 将本地 Obsidian 知识库作为静态资源暴露给客户端，支持列表展示与指定 URI 读取。
 */
server.resource(
  "local-notes",
  new ResourceTemplate("note://local/{filename}", {
    list: async () => {
      try {
        const notes = await listObsidianNotes();
        return {
          resources: notes.map(filename => ({
            name: filename,
            uri: `note://local/${encodeURIComponent(filename)}`,
            mimeType: "text/markdown",
            description: `本地笔记: ${filename}`
          }))
        };
      } catch (error: any) {
        return { resources: [] };
      }
    }
  }),
  async (uri, { filename }) => {
    try {
      const filenameStr = Array.isArray(filename) ? filename[0] : filename;
      const content = await readObsidianNote(decodeURIComponent(filenameStr));
      return { contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }] };
    } catch (error: any) {
      throw new Error(`读取笔记失败: ${error.message}`);
    }
  }
);

/**
 * 启动 MCP Server
 * 建立 stdio 传输层并开始监听客户端连接。
 * * @returns {Promise<void>}
 */
async function start(): Promise<void> {
  console.error('正在启动 MCP Server (意图识别模式 + 本地笔记)...');
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error('MCP Server 已就绪');
}

start().catch((err) => {
  console.error('服务器启动失败:', err);
  process.exit(1);
});