/**
 * 书籍生成工具集 - Tool Calling 模式
 *
 * 借鉴 OpenMAIC pblTools 做法：
 * - 用 Zod 定义输入 Schema，确保类型安全
 * - execute 函数执行实际逻辑
 * - LLM 可在生成过程中主动调用，获取上下文
 */

import { z } from 'zod';
import { ToolDefinition } from './index';

// ============ 工具定义 ============

/**
 * 创建书籍生成工具集
 * 使用工厂模式，绑定到具体书籍 ID 和 bookStore
 */
export function createBookTools(bookId: string, bookStore: any): ToolDefinition[] {
  return [
    // 工具1：获取已生成章节的摘要，避免内容重复
    {
      name: 'get_existing_chapters',
      description:
        '获取书籍中已经生成的章节内容摘要（前500字），用于了解已有内容，避免重复，保持风格一致。返回章节列表，每项包含章节号、标题、内容摘要。',
      inputSchema: z.object({
        chapter_numbers: z
          .array(z.number())
          .optional()
          .describe('要查询的章节号列表，不传则返回所有已完成章节'),
      }),
      execute: async ({ chapter_numbers }: { chapter_numbers?: number[] }) => {
        const book = await bookStore.getById(bookId);
        if (!book) return { error: '书籍不存在', chapters: [] };

        const chapters = (book.chapters || []).filter((c: any) => {
          const hasContent = c.content && c.content.length > 0;
          const inRange = !chapter_numbers || chapter_numbers.includes(c.number);
          return hasContent && inRange;
        });

        return {
          count: chapters.length,
          chapters: chapters.map((c: any) => ({
            number: c.number,
            title: c.title,
            summary: c.content ? c.content.slice(0, 500) + (c.content.length > 500 ? '...' : '') : '',
            wordCount: c.wordCount || 0,
          })),
        };
      },
    },

    // 工具2：获取书籍大纲，了解整体结构
    {
      name: 'get_book_outline',
      description:
        '获取书籍完整大纲，包括主题、结构逻辑和所有章节规划。用于了解当前章节在全书中的位置和与其他章节的关系。',
      inputSchema: z.object({}),
      execute: async () => {
        const book = await bookStore.getById(bookId);
        if (!book?.outline) return { error: '大纲不存在' };

        return {
          mainTheme: book.outline.mainTheme,
          structureLogic: book.outline.structureLogic,
          totalChapters: book.outline.chapters.length,
          chapters: book.outline.chapters.map((c: any) => ({
            number: c.number,
            title: c.title,
            summary: c.summary,
            keyPoints: c.keyPoints,
            estimatedWords: c.estimatedWords,
          })),
        };
      },
    },

    // 工具3：标记章节需要调整（LLM 发现问题时主动报告）
    {
      name: 'report_chapter_issue',
      description:
        '当发现当前章节内容与已有章节重复、结构不合理或内容缺失时，用此工具记录问题说明。返回确认消息后继续生成改进版本。',
      inputSchema: z.object({
        chapter_number: z.number().describe('问题章节号'),
        issue_type: z
          .enum(['content_overlap', 'structure_issue', 'missing_content', 'style_inconsistency'])
          .describe('问题类型'),
        description: z.string().describe('问题描述'),
        suggestion: z.string().describe('改进建议'),
      }),
      execute: async ({ chapter_number, issue_type, description, suggestion }: any) => {
        console.log(
          `[BookTools] 章节 ${chapter_number} 发现问题: [${issue_type}] ${description}，建议: ${suggestion}`
        );
        return {
          acknowledged: true,
          message: `已记录问题，请根据建议"${suggestion}"重新生成第${chapter_number}章内容。`,
        };
      },
    },
  ];
}
