import assert from 'node:assert/strict';
import test from 'node:test';
import { PROFILE_PAGE_LABELS } from './profile-page-labels';
import { PROFILE_PAGE_LABELS as frontendDefaults } from '../../../../frontend/features/shared-profile/profile-page-labels';
import { profileLabelKey, resolveSharedProfileLabels } from '../../../../frontend/features/shared-profile/profile-page-dictionary';
import { profilePageSeeds, seedProfilePages } from './profile-pages.seed';

test('every frontend profile page label has a bilingual seed with a unique key and a root parent', () => {
  assert.deepEqual(PROFILE_PAGE_LABELS, frontendDefaults, 'Run node prisma/sync-profile-page-labels.cjs');
  const seeds = profilePageSeeds();
  assert.equal(new Set(seeds.map(row => `${row.page}.${row.translationKey}`)).size, seeds.length);
  for (const [page, labels] of Object.entries(PROFILE_PAGE_LABELS)) {
    const rows = seeds.filter(row => row.page === page);
    assert.equal(rows.length, Object.keys(labels).length);
    assert.equal(rows[0].translationKey, 'page_title');
    assert.equal(rows[0].parent, undefined);
    for (const [key, defaults] of Object.entries(labels)) {
      const row = rows.find(item => item.translationKey === profileLabelKey(key))!;
      assert.equal(row.module, 'shared');
      assert.equal(row.englishText, defaults[0]);
      assert.equal(row.khmerText, defaults[1]);
      assert.ok(row.englishText.trim() && row.khmerText.trim());
      if (row.translationKey !== 'page_title') {
        assert.deepEqual(row.parent, { module: 'shared', page, translationKey: 'page_title' });
      }
    }
  }
});

test('Admin values override defaults and missing labels fall back in both languages', () => {
  const edited = resolveSharedProfileLabels('account_setting', 'kh', { full_name: 'Admin name', email_address: ' ' });
  assert.equal(edited.fullName, 'Admin name');
  assert.equal(edited.emailAddress, PROFILE_PAGE_LABELS.account_setting.emailAddress[1]);
  assert.equal(resolveSharedProfileLabels('account_setting', 'en', {}).fullName, 'Full Name');
  assert.equal(resolveSharedProfileLabels('notification_setting', 'km', {}).historyTotal.replace('{count}', '5'), 'សរុប 5 ការជូនដំណឹង');
  assert.equal(resolveSharedProfileLabels('my_organization', 'en', { edit_save: 'Admin save' }).edit_save, 'Admin save');
});

test('re-seeding preserves edited and disabled labels and parent links', async () => {
  type Row = { id: number; module: string; page: string; translationKey: string; englishText: string; isActive: boolean; parentId: number | null };
  const rows = new Map<string, Row>();
  const id = (row: { page: string; translationKey: string }) => `${row.page}.${row.translationKey}`;
  const db = { translation: {
    async findUnique({ where }: { where: { module_page_translationKey: Row } }) {
      return rows.get(id(where.module_page_translationKey)) ?? null;
    },
    async create({ data }: { data: Omit<Row, 'id'> }) {
      const row = { ...data, id: rows.size + 1 };
      rows.set(id(data), row);
      return row;
    },
  } };
  const first = await seedProfilePages(db);
  assert.equal(first.created, profilePageSeeds().length);
  const edited = rows.get('account_setting.full_name')!;
  edited.englishText = 'Edited by Admin';
  edited.isActive = false;
  const second = await seedProfilePages(db);
  assert.equal(second.created, 0);
  assert.equal(second.kept, first.created);
  assert.equal(edited.englishText, 'Edited by Admin');
  assert.equal(edited.isActive, false);
  assert.equal(edited.parentId, rows.get('account_setting.page_title')!.id);
});
