import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

/**
 * Resolve docs/openapi.json from monorepo root (dev) or OPENAPI_SPEC_PATH.
 */
export function resolveOpenApiSpecPath(): string {
  if (process.env.OPENAPI_SPEC_PATH) {
    return path.resolve(process.env.OPENAPI_SPEC_PATH);
  }
  const candidates = [
    path.resolve(process.cwd(), 'docs/openapi.json'),
    path.resolve(process.cwd(), '../../docs/openapi.json'),
    path.resolve(__dirname, '../../../../docs/openapi.json'),
  ];
  for (const candidate of candidates) {
    if (fs.existsSync(candidate)) return candidate;
  }
  return candidates[0]!;
}

export function loadOpenApiSpec(): Record<string, unknown> {
  const specPath = resolveOpenApiSpecPath();
  const raw = fs.readFileSync(specPath, 'utf8');
  const spec = JSON.parse(raw) as Record<string, unknown>;
  if (spec.openapi !== '3.1.0' && spec.openapi !== '3.0.3') {
    throw new Error(`Unexpected OpenAPI version in ${specPath}`);
  }
  if (!spec.paths || typeof spec.paths !== 'object') {
    throw new Error(`OpenAPI spec missing paths: ${specPath}`);
  }
  return spec;
}
