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

import {
  buildFormulaBindingRequest,
  formulaVersionOptions,
  parameterBindingCandidates,
  resultBindingCandidates,
} from '../../src/domain/formula-mapping';
import type { FormulaBindingCandidate } from '../../src/domain/formula-mapping';

const bindings: FormulaBindingCandidate[] = [
  { id: 'decimal', controlRole: 'PRIMARY', status: 'ACTIVE', fieldDataType: 'DECIMAL', readSource: 'NONE', writeTarget: 'ELN_RECORD', batchMode: 'RECORD_PRIVATE' },
  { id: 'text', controlRole: 'PRIMARY', status: 'ACTIVE', fieldDataType: 'TEXT', readSource: 'NONE', writeTarget: 'ELN_RECORD', batchMode: 'RECORD_PRIVATE' },
  { id: 'reference', controlRole: 'REFERENCE', status: 'ACTIVE', fieldDataType: 'DECIMAL', readSource: 'NONE', writeTarget: 'ELN_RECORD', batchMode: 'RECORD_PRIVATE' },
  { id: 'disabled', controlRole: 'PRIMARY', status: 'CANCELLED', fieldDataType: 'DECIMAL', readSource: 'NONE', writeTarget: 'ELN_RECORD', batchMode: 'RECORD_PRIVATE' },
  { id: 'readonly', controlRole: 'PRIMARY', status: 'ACTIVE', fieldDataType: 'DECIMAL', readSource: 'LIMS_TASK', writeTarget: 'ELN_RECORD', batchMode: 'RECORD_PRIVATE' },
];

describe('formula mapping rules', () => {
  it('只允许启用公式的当前 PUBLISHED 与任意 PRE_RELEASE 新建映射，历史发布版本只读展示', () => {
    expect(formulaVersionOptions([
      { id: 'current', formulaEnabled: true, isCurrent: true, status: 'PUBLISHED' },
      { id: 'pre', formulaEnabled: true, isCurrent: false, status: 'PRE_RELEASE' },
      { id: 'historic', formulaEnabled: true, isCurrent: false, status: 'PUBLISHED' },
      { id: 'disabled', formulaEnabled: false, isCurrent: true, status: 'PUBLISHED' },
    ])).toEqual([
      { id: 'current', risk: false, selectable: true },
      { id: 'pre', risk: true, selectable: true },
      { id: 'historic', risk: false, selectable: false },
    ]);
  });

  it('槽位只接受类型兼容的 ACTIVE PRIMARY，P3 拒绝集合槽位', () => {
    expect(parameterBindingCandidates('DECIMAL', bindings)).toEqual(['decimal', 'readonly']);
    expect(parameterBindingCandidates('TEXT', bindings)).toEqual(['text']);
    expect(parameterBindingCandidates('DECIMAL_LIST', bindings)).toEqual([]);
  });

  it('结果仅接受可写的 ACTIVE PRIMARY 且类型兼容的字段', () => {
    expect(resultBindingCandidates('DECIMAL', bindings)).toEqual(['decimal']);
  });

  it('请求体仅发送公式版本、绑定 ID 和操作码', () => {
    expect(buildFormulaBindingRequest({
      formulaVersionId: 'formula-version',
      parameterBindings: { amount: 'decimal' },
      resultBindingId: 'result',
      operationCode: 'reserve-1',
    })).toEqual({
      formulaVersionId: 'formula-version',
      parameterBindings: { amount: 'decimal' },
      resultBindingId: 'result',
      operationCode: 'reserve-1',
    });
  });
});
