import { describe, expect, it } from 'vitest';

import { buildDraftFields } from '../../src/domain/draft';

const field = (tag: string, type: any, currentValue: boolean | string) => ({ alias: tag, currentValue, internalId: `id-${tag}`, options: [], tag, type });

describe('buildDraftFields', () => {
  it('fills only empty standard fields and always applies checkbox data', () => {
    const fields = buildDraftFields(
      [field('eln.field.empty', 'text', ''), field('eln.field.kept', 'text', 'document'), field('eln.field.ok', 'checkbox', true)],
      {
        fields: {
          'eln.field.empty': { type: 'text', value: 'api' },
          'eln.field.kept': { type: 'text', value: 'api' },
          'eln.field.ok': { type: 'checkbox', value: false },
        },
        repeatGroups: [],
      },
    );
    expect(fields.map((item) => item.draftValue)).toEqual(['api', 'document', false]);
  });

  it('keeps document fields when API fields are empty', () => {
    expect(buildDraftFields([field('eln.field.name', 'text', 'A')], { fields: {}, repeatGroups: [] })).toHaveLength(1);
  });

  it('restores record current state into both a primary field and its readonly reference', () => {
    const fields = buildDraftFields(
      [field('eln.field.name', 'text', 'stale primary'), field('eln.ref.name.instance_1', 'text', 'stale reference')],
      {
        fields: { 'eln.field.name': { type: 'text', value: 'authoritative value' } },
        repeatGroups: [],
      },
      { preferData: true },
    );

    expect(fields.map((item) => item.draftValue)).toEqual(['authoritative value', 'authoritative value']);
  });

  it('carries cross-template readonly metadata into the primary draft field', () => {
    const fields = buildDraftFields(
      [field('eln.field.source_result', 'text', '旧值')],
      {
        fields: {
          'eln.field.source_result': {
            readOnly: true,
            type: 'text',
            value: '快照值',
            valueSource: 'CROSS_TEMPLATE',
          },
        },
        repeatGroups: [],
      },
      { preferData: true },
    );

    expect(fields[0]).toMatchObject({
      draftValue: '快照值',
      readOnly: true,
      valueSource: 'CROSS_TEMPLATE',
    });
  });

  it('maps a dotted reference tag back to its dotted primary field', () => {
    const fields = buildDraftFields(
      [field('eln.ref.inspection.result.instance_1', 'text', 'stale reference')],
      {
        fields: { 'eln.field.inspection.result': { type: 'text', value: 'authoritative value' } },
        repeatGroups: [],
      },
      { preferData: true },
    );

    expect(fields[0]?.draftValue).toBe('authoritative value');
  });

  it('inherits repeat column required metadata without copying another row value', () => {
    const fields = buildDraftFields(
      [field('eln.repeat.results.row-2.value', 'text', '')],
      {
        fields: {
          'eln.repeat.results.row-1.value': { required: true, type: 'text', value: '第一行' },
        },
        repeatGroups: [],
      },
    );

    expect(fields[0]).toMatchObject({ draftValue: '', required: true, requiredKnown: true });
  });

  it('carries checkbox groups to editable primary and repeated fields but not references', () => {
    const fields = buildDraftFields(
      [
        field('eln.field.passed', 'checkbox', false),
        field('eln.ref.passed.instance-1', 'checkbox', false),
        field('eln.repeat.results.row-2.qualified', 'checkbox', false),
      ],
      {
        fields: {
          'eln.field.passed': {
            checkboxGroupCode: 'inspection_result', checkboxGroupMaxSelected: 2, checkboxGroupMinSelected: 1, type: 'checkbox', value: false,
          },
          'eln.repeat.results.row-1.qualified': {
            checkboxGroupCode: 'row_result', checkboxGroupMaxSelected: null, checkboxGroupMinSelected: 1, type: 'checkbox', value: true,
          },
        },
        repeatGroups: [{
          activeRowCount: 0,
          checkboxGroups: { qualified: 'row_result' },
          groupCode: 'results',
          maxRows: 5,
          minRows: 0,
          rows: [],
        }],
      },
    );

    expect(fields[0]).toMatchObject({
      checkboxGroupCode: 'inspection_result', checkboxGroupMaxSelected: 2, checkboxGroupMinSelected: 1,
    });
    expect(fields[1]).not.toHaveProperty('checkboxGroupCode');
    expect(fields[2]).toMatchObject({
      checkboxGroupCode: 'row_result', checkboxGroupMaxSelected: null, checkboxGroupMinSelected: 1,
    });
  });

  it('can retain metadata while ignoring stale values during a document structure refresh', () => {
    const fields = buildDraftFields(
      [field('eln.field.confirmed', 'checkbox', true)],
      {
        fields: { 'eln.field.confirmed': { required: true, type: 'checkbox', value: false } },
        repeatGroups: [],
      },
      { ignoreDataValues: true },
    );

    expect(fields[0]).toMatchObject({ draftValue: true, required: true, requiredKnown: true });
  });
});
