/**
 * local_task_comments の1行を、横断検索の索引テキストに正規化・墨消しする。
 * allowlist 方式: 既知 kind / progress type のみ索引。tool_call はツール名のみ
 * （args 値・result は入れない）。未知・空は null（索引しない）。
 */
const TEXT_KINDS = new Set(['request', 'interjection', 'result', 'ask', 'handoff']);

function attachmentNames(attachments: string | null): string[] {
  if (!attachments) return [];
  try {
    const arr = JSON.parse(attachments);
    return Array.isArray(arr) ? arr.filter((x) => typeof x === 'string') : [];
  } catch {
    return [];
  }
}

function nonEmpty(s: string): string | null {
  const t = s.trim();
  return t.length > 0 ? t : null;
}

export function normalizeCommentToIndexText(
  kind: string,
  body: string,
  attachments: string | null,
): string | null {
  if (TEXT_KINDS.has(kind)) {
    const names = attachmentNames(attachments);
    const suffix = names.length > 0 ? ` 添付: ${names.join(', ')}` : '';
    return nonEmpty(`${body}${suffix}`);
  }
  if (kind === 'progress') {
    let parsed: { type?: unknown; text?: unknown; name?: unknown; summary?: unknown } | null = null;
    try {
      parsed = JSON.parse(body);
    } catch {
      return null; // progress は JSON 前提。壊れていれば索引しない
    }
    if (!parsed || typeof parsed !== 'object') return null;
    if (parsed.type === 'thinking' && typeof parsed.text === 'string') return nonEmpty(parsed.text);
    if (parsed.type === 'tool_call' && typeof parsed.name === 'string') return `tool: ${parsed.name}`;
    if (parsed.type === 'interjection_ack') return null; // 既知だがノイズ、索引不要
    if (typeof parsed.summary === 'string') return nonEmpty(parsed.summary); // movement summary
    return null; // 未知 progress type
  }
  return null; // 未知 kind
}
