import { existsSync } from 'node:fs';
import { join } from 'node:path';
import { ToolDef } from '../../llm/openai-compat.js';
import { ToolContext, ToolResult } from './core.js';

export const TOOL_DEFS: Record<string, ToolDef> = {
  SpawnSubTask: {
    type: 'function',
    function: {
      name: 'SpawnSubTask',
      description: 'サブタスクを作成してキューに追加します。分解した調査項目などを並列実行したい場合に使用します。複数回呼び出すことで複数のサブタスクを並列スケジュールできます。分解判断・instruction の書き方は ReadToolDoc({ name: "SpawnSubTask" })。',
      parameters: {
        type: 'object',
        properties: {
          title: {
            type: 'string',
            description: 'サブタスクのタイトル（簡潔に）',
          },
          instruction: {
            type: 'string',
            description: 'サブタスクへの詳細な指示。何を調査・実行してほしいか、どんな形式で output/ に結果を書いてほしいかを具体的に記述する。',
          },
          piece: {
            type: 'string',
            description: '使用するピース名（general, research, brainstorming, orchestrated, data-process, office-process）。デフォルトは general。',
          },
        },
        required: ['title', 'instruction'],
      },
    },
  },
};

export async function executeTool(
  name: string,
  input: Record<string, unknown>,
  ctx: ToolContext,
): Promise<ToolResult | null> {
  if (name !== 'SpawnSubTask') return null;

  const { spawnSubTask } = ctx;
  if (!spawnSubTask) {
    return { output: 'SpawnSubTask はこのコンテキストでは使用できません', isError: true };
  }

  const title = typeof input['title'] === 'string' ? input['title'].trim() : '';
  const instruction = typeof input['instruction'] === 'string' ? input['instruction'].trim() : '';
  const piece = typeof input['piece'] === 'string' ? input['piece'] : 'general';

  if (!title || !instruction) {
    return { output: 'title と instruction は必須です', isError: true };
  }

  const builtinPath = join('pieces', `${piece}.yaml`);
  const customDirs = ctx.customPiecesDir
    ? (Array.isArray(ctx.customPiecesDir) ? ctx.customPiecesDir : [ctx.customPiecesDir])
    : [];
  const customExists = customDirs.some(d => existsSync(join(d, `${piece}.yaml`)));
  if (!existsSync(builtinPath) && !customExists) {
    return {
      output: `指定されたピース "${piece}" が見つかりません。利用可能なピースを確認してください。`,
      isError: true,
    };
  }

  try {
    const result = await spawnSubTask({ title, instruction, piece });
    return {
      output: [
        `サブタスク #${result.subtaskIndex} を登録しました。`,
        `タイトル: ${title}`,
        `ジョブ ID: ${result.jobId}`,
        `ワークスペース: ${result.workspacePath}`,
      ].join('\n'),
      isError: false,
    };
  } catch (err) {
    return {
      output: `SpawnSubTask 失敗: ${err instanceof Error ? err.message : String(err)}`,
      isError: true,
    };
  }
}
