import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
import Ajv, { type ValidateFunction } from 'ajv';
import addFormats from 'ajv-formats';
import type { Brief } from './types';

const schemaPath = resolve(process.cwd(), 'schemas', 'brief.schema.json');
const schema = JSON.parse(readFileSync(schemaPath, 'utf-8')) as object;

const ajv = new Ajv({ allErrors: true, strict: false });
addFormats(ajv);
const validate: ValidateFunction = ajv.compile(schema);

export function validateBrief(data: unknown): asserts data is Brief {
  const valid = validate(data);
  if (!valid) {
    const lines = (validate.errors ?? []).map(
      (e) => `${e.instancePath || '/'} ${e.message ?? 'invalid'}`,
    );
    throw new Error(`Invalid brief:\n${lines.join('\n')}`);
  }
}