import assert from 'node:assert/strict';
import test from 'node:test';
import { PSWG_TRANSLATIONS, CDCGPSF_TRANSLATIONS } from './index';
import { meetingSummaryText } from '../../../../frontend/features/pswg/meeting-summary/meeting-summary-i18n';
import { fetchMeetingSummaryTranslations } from '../../../../frontend/features/pswg/meeting-summary/meeting-summary-translation-service';

function flatten(o: object, prefix = ''): Record<string, string> {
  return Object.assign({}, ...Object.entries(o).map(([k, v]) => typeof v === 'string' ? { [prefix + k]: v } : flatten(v, prefix + k + '.')));
}
function key(path: string) {
  return path === 'pageTitle' ? 'page_title' : path === 'pageSubtitle' ? 'subtitle' : path.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase();
}
test('all PSWG screen labels and shared controls are bilingual and independently seeded for consumers', () => {
  const en = flatten(meetingSummaryText.en);
  assert.deepEqual(Object.keys(en).sort(), Object.keys(flatten(meetingSummaryText.kh)).sort());
  for (const seeds of [PSWG_TRANSLATIONS, CDCGPSF_TRANSLATIONS]) {
    const rows = seeds.filter(x => x.page === 'meeting_summary');
    assert.equal(new Set(rows.map(x => x.translationKey)).size, rows.length);
    for (const path of Object.keys(en)) {
      const row = rows.find(x => x.translationKey === key(path));
      assert.ok(row?.englishText.trim() && row.khmerText.trim(), `${seeds[0].module}/${key(path)}`);
    }
  }
});
test('public dictionary maps every screen label without cross-module values or Admin-list access', async t => {
  t.mock.method(globalThis, 'fetch', async input => {
    const url = new URL(String(input));
    assert.ok(url.pathname.endsWith('/translations/dictionary'));
    assert.equal(url.searchParams.get('page'), 'meeting_summary');
    const prefix = url.searchParams.get('module') + '/' + url.searchParams.get('language') + '/';
    const translations = Object.fromEntries(Object.keys(flatten(meetingSummaryText.en)).map(p => [key(p), prefix + key(p)]));
    return new Response(JSON.stringify({data:{translations}}));
  });
  for (const owner of ['pswg', 'cdcgpsf'] as const) for (const lang of ['en', 'kh'] as const) {
    const result = await fetchMeetingSummaryTranslations(lang, owner);
    for (const [path, value] of Object.entries(flatten(result.text))) {
      assert.equal(value, `${owner}/${lang === 'kh' ? 'km' : 'en'}/${key(path)}`, path);
    }
  }
});
