import { Command } from 'commander';
import type { ApiClient } from '../api-client.js';

export interface ErrorsCommandDeps {
  client: ApiClient;
  log: (...args: string[]) => void;
}

interface ErrorEntry {
  time: number;
  level: number;
  msg?: string;
  kind?: string;
  reqId?: string;
  err?: string;
}

/** pino numeric level → short label. */
function levelLabel(level: number): string {
  if (level >= 60) return 'FATAL';
  if (level >= 50) return 'ERROR';
  return String(level);
}

function fmtTime(ms: number): string {
  if (!ms) return '-';
  // Local HH:MM:SS — enough to correlate with "it broke just now".
  const d = new Date(ms);
  const p = (n: number): string => String(n).padStart(2, '0');
  return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
}

export function createErrorsCommand(deps?: Partial<ErrorsCommandDeps>): Command {
  const log = deps?.log ?? ((...args: string[]): void => { console.log(...args); });

  return new Command('errors')
    .description('Show recent mcpd error/fatal log entries')
    .option('-n, --limit <count>', 'max entries to show (default 50)', '50')
    .action(async (opts: { limit: string }) => {
      const client = deps?.client;
      if (!client) throw new Error('errors: no API client configured');

      const limit = Number(opts.limit) > 0 ? Number(opts.limit) : 50;
      const res = await client.get<{ errors: ErrorEntry[] }>(`/api/v1/logs/errors?limit=${limit}`);
      const errors = res.errors ?? [];

      if (errors.length === 0) {
        log('No recent mcpd errors. 🎉');
        return;
      }

      log(`TIME      LEVEL  DETAIL`);
      for (const e of errors) {
        const detail = [e.kind, e.msg ?? e.err].filter(Boolean).join(' — ') || '(no message)';
        log(`${fmtTime(e.time).padEnd(9)} ${levelLabel(e.level).padEnd(6)} ${detail}`);
      }
      log(`\n${errors.length} entr${errors.length === 1 ? 'y' : 'ies'} (most recent first; in-memory, cleared on mcpd restart)`);
    });
}
