import { serveStdio } from '@modelcontextprotocol/server/stdio';
import { OrchestratorService } from '@platform-modules/chatgpt-orchestrator-core';
import { ExecutorBridge } from './executor-bridge.js';
import { ExecutionContinuityScheduler } from './execution-continuity.js';
import { loadExecutorRuntimeConfig } from './executor-auth.js';
import { createDefaultRepository, createOrchestratorMcpServer } from './server.js';
import { startRetention } from './retention.js';

const repository = createDefaultRepository();
const service = new OrchestratorService(repository);
const retention = await startRetention(service);
const executorConfig = await loadExecutorRuntimeConfig();
const bridge = new ExecutorBridge(service, executorConfig);
await bridge.start();
const continuity = new ExecutionContinuityScheduler(service, bridge);
continuity.start();
const handle = serveStdio(() => createOrchestratorMcpServer(service, bridge, continuity));

console.error(`chatgpt-orchestrator MCP listening on stdio; executor bridge ${bridge.address}; token file ${executorConfig.tokenPath}`);

let closing = false;
async function shutdown(signal: string): Promise<void> {
  if (closing) return;
  closing = true;
  retention.close();
  continuity.stop();
  console.error(`chatgpt-orchestrator MCP shutting down (${signal})`);
  try {
    await bridge.close();
    await handle.close();
    // No new mutations can arrive once handlers are closed, so this captures any
    // coalesced write left pending by the debounce.
    await repository.flush();
    process.exitCode = 0;
  } catch (error) {
    console.error(error);
    process.exitCode = 1;
  }
}

process.once('SIGINT', () => { void shutdown('SIGINT'); });
process.once('SIGTERM', () => { void shutdown('SIGTERM'); });
