import { describe, test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';

// Lint-test for the persona-reviewer fasit fixture.
// Mirrors the structure-only discipline of state-updater.test.mjs and
// fact-checker-fixture.test.mjs: this test asserts the SHAPE of the fixture —
// one reader persona carrying all five library fields, a non-empty sample
// draft, the six judging axes, and both review modes documented. Whether the
// agent's live flags actually match the fasit directions is [GATE]/[OPERATØR],
// never self-certified here.

const FIXTURE_PATH = fileURLToPath(
  new URL('./fixtures/persona-reviewer-cases.md', import.meta.url)
);

const fixture = readFileSync(FIXTURE_PATH, 'utf8');

// The five persona field keys, lowercase to match config/personas.template.md.
const PERSONA_FIELDS = ['rolle', 'avkobler', 'overbeviser', 'ekspertise', 'sjargong'];

// The six judging axes (plan Step 6 / fasit §6.3).
const AXES = [
  'Krok',           // hook holds?
  'Resonans',       // does the point land?
  'Tone',           // tone fit for this reader
  'Troverdighet',   // credibility
  'Leder-takeaway', // leader takeaway + concrete action
  'Lengde',         // length / drive
];

// Both review modes must be documented (resonance + conversion).
const MODES = ['resonans', 'konverter'];

describe('persona-reviewer fixture structure', () => {
  test('documents one persona with all five library fields', () => {
    for (const field of PERSONA_FIELDS) {
      assert.ok(
        new RegExp(`\\*\\*${field}\\*\\*`).test(fixture),
        `fixture must document the persona field **${field}**`
      );
    }
  });

  test('contains a non-empty sample-text section', () => {
    const m = fixture.match(/##\s+Sample-tekst\b([\s\S]*?)(?=\n##\s|$)/i);
    assert.ok(m, 'fixture must have a "## Sample-tekst" section');
    assert.ok(
      m[1].trim().length > 80,
      'the sample-text section must contain a real draft excerpt, not a stub'
    );
  });

  test('documents all six judging axes', () => {
    for (const axis of AXES) {
      assert.ok(fixture.includes(axis), `fixture must name the axis "${axis}"`);
    }
  });

  test('documents both review modes (resonance + conversion)', () => {
    for (const mode of MODES) {
      assert.ok(
        new RegExp(mode, 'i').test(fixture),
        `fixture must document the "${mode}" mode`
      );
    }
  });
});
