import { describe, expect, it } from 'vitest';
import {
  buildInitialOfficialFormPreviewFields,
  hasOfficialFormPreviewFieldChanges,
  sanitizeOfficialFormPreviewFields,
  toOfficialFormPreviewOverlayEdits,
} from '@/components/applicant/initiative-draft/officialFormPreviewFieldEdits';

describe('officialFormPreviewFieldEdits', () => {
  it('extracts initial values from TRANG BIA', () => {
    const official = {
      'TRANG BÌA': {
        'Tên sáng kiến (Tiếng Việt)': 'Nâng cao quy trình tiếp nhận',
        'Tác giả/nhóm tác giả sáng kiến': 'Nguyễn Văn A; Trần Thị B',
        'Đơn vị công tác': 'Phòng Khoa học Công nghệ',
        'Thông tin liên hệ (Điện thoại, Email)': '0909 111 222 · a@example.org',
      },
    } as Record<string, unknown>;

    const out = buildInitialOfficialFormPreviewFields(official);
    expect(out.initiativeTitle).toBe('Nâng cao quy trình tiếp nhận');
    expect(out.authorGroup).toBe('Nguyễn Văn A; Trần Thị B');
    expect(out.workUnit).toBe('Phòng Khoa học Công nghệ');
    expect(out.contactInfo).toBe('0909 111 222 · a@example.org');
  });

  it('sanitizes and trims text before creating overlays', () => {
    const fields = sanitizeOfficialFormPreviewFields({
      initiativeTitle: '  A\n   B  ',
      authorGroup: '   ',
      workUnit: '  Khoa CNTT  ',
      contactInfo: '  09xx  ',
    });
    const edits = toOfficialFormPreviewOverlayEdits(fields);
    expect(edits.map((x) => x.id)).toEqual(['preview-initiativeTitle', 'preview-workUnit', 'preview-contactInfo']);
    expect(edits[0]?.text).toBe('A\nB');
    expect(edits[1]?.text).toBe('Khoa CNTT');
  });

  it('detects meaningful field changes', () => {
    const base = sanitizeOfficialFormPreviewFields({
      initiativeTitle: 'Tên 1',
      authorGroup: 'Nhóm 1',
      workUnit: 'Đơn vị A',
      contactInfo: '1',
    });
    const same = sanitizeOfficialFormPreviewFields(base);
    const changed = sanitizeOfficialFormPreviewFields({ ...base, contactInfo: '2' });
    expect(hasOfficialFormPreviewFieldChanges(same, base)).toBe(false);
    expect(hasOfficialFormPreviewFieldChanges(changed, base)).toBe(true);
  });
});
