import { existsSync, readdirSync } from 'node:fs';
import { join } from 'node:path';
import type { Message } from '../../llm/openai-compat.js';
import type { EventLogger } from '../../progress/event-log.js';
import { logger } from '../../logger.js';

const WATCHDOG_REMINDER_AFTER_ITERATIONS = 5;

const workspaceHasActiveChecklist = (workspacePath: string): boolean => {
  try {
    const dir = join(workspacePath, 'logs', 'checklists');
    if (!existsSync(dir)) return false;
    return readdirSync(dir).some((f) => f.endsWith('.json'));
  } catch {
    return false;
  }
};

export interface MovementWatchdogs {
  markToolUse: (toolName: string) => void;
  maybeFire: (
    iteration: number,
    movementName: string,
    messages: Message[],
    eventLogger: EventLogger,
  ) => void;
}

export const createMovementWatchdogs = (opts: {
  workspacePath: string;
  missionWatchdogEnabled: boolean;
  missionAware: boolean;
}): MovementWatchdogs => {
  let checklistAware = workspaceHasActiveChecklist(opts.workspacePath);
  let checklistReminderSent = false;
  let missionAware = opts.missionAware;
  let missionReminderSent = false;

  const markToolUse = (toolName: string): void => {
    if (toolName === 'CreateChecklist' || toolName === 'GetChecklist' || toolName === 'CheckItem') {
      checklistAware = true;
    }
    if (toolName === 'MissionUpdate') {
      missionAware = true;
    }
  };

  const maybeFire = (
    iteration: number,
    movementName: string,
    messages: Message[],
    eventLogger: EventLogger,
  ): void => {
    if (
      !checklistAware
      && !checklistReminderSent
      && iteration >= WATCHDOG_REMINDER_AFTER_ITERATIONS
    ) {
      messages.push({
        role: 'user',
        content: `[checklist watchdog] 既に ${iteration} 回ツール呼び出しを実行していますが、チェックリストがまだ作成されていません。\nこのタスクが 3 ステップ以上に分かれる可能性があるなら、ここで一度立ち止まり \`CreateChecklist\` で計画を可視化してから続行してください。\n単純な作業で残りのステップが少ないと判断した場合は無視して進めて構いません。`,
      });
      checklistReminderSent = true;
      logger.info(`[agent-loop] movement=${movementName} checklist watchdog nudge sent at iteration=${iteration}`);
      eventLogger.emit('watchdog_fire', { kind2: 'checklist', iteration }, { iteration });
    }

    if (
      opts.missionWatchdogEnabled
      && !missionAware
      && !missionReminderSent
      && iteration >= WATCHDOG_REMINDER_AFTER_ITERATIONS
    ) {
      messages.push({
        role: 'user',
        content: `[mission watchdog] 既に ${iteration} 回ツール呼び出しを実行していますが、Mission Brief の goal がまだ未設定です。\nこのタスクの本質的な目標を verbatim に \`MissionUpdate({ goal: "..." })\` で固定してから続行してください。会話が長くなったときに最初の要件を見失わないための pinned メモです。\n単純な1ステップ作業なら無視して構いません。`,
      });
      missionReminderSent = true;
      logger.info(`[agent-loop] movement=${movementName} mission watchdog nudge sent at iteration=${iteration}`);
      eventLogger.emit('watchdog_fire', { kind2: 'mission', iteration }, { iteration });
    }
  };

  return { markToolUse, maybeFire };
};
