export type ControlType = 'text' | 'dropdown' | 'checkbox' | 'date' | 'multiline';

export interface DropdownOption {
  display: string;
  value: string;
}

export interface RawTypeConfig {
  controlType: string;
  placeholder?: string;
  defaultValue?: string;
  defaultChecked?: boolean;
  options?: DropdownOption[];
  defaultOptionValue?: string;
}

export type TypeConfigValidationField = 'control-type' | 'text-default' | 'dropdown-options' | 'dropdown-default' | 'date-default';

export type ValidationResult<T, F extends string = string> = { ok: true; value: T } | { field: F; message: string; ok: false };

export interface ValidatedDropdownConfig {
  controlType: 'dropdown';
  options: DropdownOption[];
  placeholder: string;
  selectedIndex: number;
}

export interface ValidatedStandardConfig {
  controlType: Exclude<ControlType, 'dropdown'>;
  dateFormat?: string;
  defaultChecked: boolean;
  defaultValue: string;
  placeholder: string;
}

export type ValidatedTypeConfig = ValidatedDropdownConfig | ValidatedStandardConfig;

export interface FieldDefinitionInput {
  alias: string;
  fieldCode: string;
  typeConfig: RawTypeConfig | null | undefined;
}

export type FieldDefinitionValidationField = 'field-code' | 'field-alias' | TypeConfigValidationField;

export interface FieldColor {
  B: number;
  G: number;
  R: number;
}

interface FieldDefinitionBase {
  alias: string;
  color: FieldColor;
  fieldCode: string;
  tag: string;
}

export type FieldDefinition = FieldDefinitionBase & (ValidatedDropdownConfig | ValidatedStandardConfig);

export type TemplateFieldScope = 'GLOBAL' | 'TEMPLATE';
export type TemplateFieldVersionStatus = 'CANCELLED' | 'DRAFT' | 'PRE_RELEASE' | 'PUBLISHED';
export type TemplateFieldDataType = 'CHECKBOX' | 'DATE' | 'DATETIME' | 'DECIMAL' | 'SELECT' | 'TEXT' | 'TEXTAREA';
export type TemplateFieldReadSource = 'LIMS_TASK' | 'NONE' | 'SYSTEM';

export interface TemplateFieldReadBinding {
  property: null | string;
  source: TemplateFieldReadSource;
}

export interface TemplateFieldWriteBinding {
  target: null | string;
}

export interface TemplateFieldBindingConfig {
  read: null | TemplateFieldReadBinding;
  write: null | TemplateFieldWriteBinding;
}

export interface TemplateFieldVersion {
  banbenHao: null | number;
  binding: null | TemplateFieldBindingConfig;
  bizStatus: TemplateFieldVersionStatus;
  chuangjianShijian: null | string;
  danwei: null | string;
  gengxinShijian: null | string;
  id: string;
  kongjianPeizhi: null | Record<string, unknown>;
  piciMoshi: null | string;
  recommendedCheckboxGroupCode?: null | string;
  recommendedCheckboxMaxSelected?: null | number;
  recommendedCheckboxMinSelected?: null | number;
  shifouBitian: null | number;
  shujuLeixing: TemplateFieldDataType;
  ziduanDingyiId: string;
  ziduanMingcheng: string;
  zuofeiYuanyin: null | string;
}

export interface TemplateFieldIdentity {
  beizhu: null | string;
  bizEnabled: string;
  dangqianZiduanBanbenId: null | string;
  id: string;
  mubanBianhao: null | string;
  versions: TemplateFieldVersion[];
  ziduanBianma: string;
  zuoyongFanwei: TemplateFieldScope;
}

export interface TemplateFieldOption {
  alias: string;
  batchMode?: string;
  controlConfig: null | Record<string, unknown>;
  fieldCode: string;
  fieldId: string;
  fieldVersionId: string;
  isCurrent: boolean;
  label: string;
  required: boolean;
  recommendedCheckboxGroupCode?: null | string;
  recommendedCheckboxMaxSelected?: null | number;
  recommendedCheckboxMinSelected?: null | number;
  scope: TemplateFieldScope;
  source: TemplateFieldReadSource;
  type: TemplateFieldDataType;
  versionStatus: TemplateFieldVersionStatus;
  writeTarget?: string;
}

export interface TemplateBinding {
  checkboxGroupCode?: null | string;
  controlAlias: null | string;
  controlConfig: null | Record<string, unknown>;
  controlRole: string;
  controlTag: string;
  controlType: string;
  fieldCode: string;
  fieldId: string;
  fieldVersionId: string;
  id: string;
  primaryBindingId: null | string;
  repeatGroupCode?: null | string;
  repeatPrototypeRowId?: null | string;
  readOnly?: boolean;
  status: string;
  stepId?: null | string;
  templateId: string;
  valueSource?: string;
  version: number;
}

export interface TemplateControlSnapshot {
  bindingId: string;
  controlAlias?: null | string;
  controlConfig?: null | Record<string, unknown>;
  controlRole?: null | string;
  controlTag: string;
  controlType?: null | string;
  fieldVersionId?: null | string;
  primaryBindingId?: null | string;
  repeatGroupCode?: null | string;
  repeatPrototypeRowId?: null | string;
  stepId?: null | string;
}

export interface TemplateDiagnostic {
  bindingId: null | string;
  code: string;
  controlTag: null | string;
  message: string;
  severity: string;
}

export interface TemplateAnnotationContext {
  bindings: TemplateBinding[];
  checkboxGroups?: TemplateCheckboxGroup[];
  copiedPendingBindingIds?: string[];
  fields: TemplateFieldIdentity[];
  repeatGroups?: TemplateRepeatGroup[];
  stepConfiguration: TemplateStepConfiguration;
  templateCode: string;
  templateId: string;
  upgradeOperationCode?: string;
}

export interface TemplateCheckboxGroup {
  groupCode: string;
  maxSelected: null | number;
  minSelected: number;
  version: number;
}

export type TemplateCheckboxGroupDraft = Pick<TemplateCheckboxGroup, 'groupCode' | 'maxSelected' | 'minSelected'>;

export interface TemplateRepeatGroup {
  groupCode: string;
  maxRows: number;
  minRows: number;
  stepId?: null | string;
}

export interface TemplateStep {
  id: string;
  name: string;
  order: number;
}

export interface TemplateStepConfiguration {
  singleStep: boolean;
  steps: TemplateStep[];
}

export interface TemplatePrivateFieldDraft {
  checkboxGroupCode?: string;
  checkboxGroupMaxSelected?: null | number;
  checkboxGroupMinSelected?: number;
  kongjianPeizhi: Record<string, unknown>;
  shujuLeixing: TemplateFieldDataType;
  ziduanMingcheng: string;
}

export interface TemplateChangeCheck {
  controls: TemplateControlSnapshot[];
  dependencies: TemplateDiagnostic[];
  expectedVersions: Record<string, number>;
  operationCode: string;
}

export interface TemplateRepairContext extends TemplateChangeCheck {
  binding: TemplateBinding;
}

export interface TemplateOperationForm {
  operationCode: string;
}

export interface TemplateCancelForm extends TemplateOperationForm {
  reason: string;
}

export interface TemplateReserveBindingForm extends TemplateOperationForm {
  checkboxGroupCode?: string;
  checkboxGroupMaxSelected?: null | number;
  checkboxGroupMinSelected?: number;
  fieldId: string;
  fieldVersionId: string;
  maxRows?: number;
  minRows?: number;
  repeatGroupCode?: string;
  repeatPrototypeRowId?: string;
  repeatRequest: boolean;
  stepId: string;
}

export interface TemplateChangeCheckboxGroupForm extends TemplateOperationForm {
  checkboxGroupCode: null | string;
  checkboxGroupMaxSelected?: null | number;
  checkboxGroupMinSelected?: number;
  expectedVersion: number;
}

export interface TemplateChangeCheckboxGroupRuleForm extends TemplateOperationForm {
  expectedVersion: number;
  maxSelected: null | number;
  minSelected: number;
}

export interface CrossTemplateScalarCandidate {
  sourceFieldCode: string;
  sourceFieldId: string;
  sourceFieldName: string;
  sourceFieldType: TemplateFieldDataType;
  sourceFieldVersionId: string;
  sourceTemplateCode: string;
  sourceTemplateId: string;
}

export interface CrossTemplateSourceTemplate {
  sourceTemplateCode: string;
  sourceTemplateId: string;
}

export interface TemplateReserveCrossTemplateScalarBindingForm extends TemplateOperationForm {
  repeatRequest: false;
  sourceFieldId: string;
  sourceFieldVersionId: string;
  sourceTemplateCode: string;
  sourceTemplateId: string;
  stepId: string;
}

export interface TemplatePrivateFieldForm extends TemplateOperationForm {
  beizhu?: null | string;
  binding?: null | TemplateFieldBindingConfig;
  checkboxGroupCode?: string;
  checkboxGroupMaxSelected?: null | number;
  checkboxGroupMinSelected?: number;
  danwei?: null | string;
  kongjianPeizhi?: null | Record<string, unknown>;
  piciMoshi?: null | string;
  shifouBitian?: null | number;
  shujuLeixing: TemplateFieldDataType;
  stepId: string;
  ziduanMingcheng: string;
}

export interface TemplateUpgradeCheckForm {
  targetFieldVersionId: string;
}

export interface TemplateChangeConfirmForm extends TemplateOperationForm {
  controls: TemplateControlSnapshot[];
  expectedVersions: Record<string, number>;
  observedControlTags: string[];
}

export interface TemplateUpgradeConfirmForm extends TemplateChangeConfirmForm {
  targetFieldVersionId: string;
}

export interface TemplateVersionCopyConfirmForm {
  controls: TemplateControlSnapshot[];
  expectedVersions: Record<string, number>;
  upgradeOperationCode: string;
}

export function toTemplateFieldOptions(fields: TemplateFieldIdentity[]): TemplateFieldOption[] {
  return fields.flatMap((field) =>
    field.versions.map((version) => ({
      fieldId: field.id,
      fieldCode: field.ziduanBianma,
      fieldVersionId: version.id,
      scope: field.zuoyongFanwei,
      label: version.ziduanMingcheng,
      alias: version.ziduanMingcheng,
      batchMode: version.piciMoshi ?? '',
      controlConfig: version.kongjianPeizhi,
      required: version.shifouBitian === 1,
      recommendedCheckboxGroupCode: version.recommendedCheckboxGroupCode,
      recommendedCheckboxMaxSelected: version.recommendedCheckboxMaxSelected,
      recommendedCheckboxMinSelected: version.recommendedCheckboxMinSelected,
      type: version.shujuLeixing,
      source: version.binding?.read?.source ?? 'NONE',
      versionStatus: version.bizStatus,
      writeTarget: version.binding?.write?.target ?? '',
      isCurrent: version.id === field.dangqianZiduanBanbenId,
    })),
  );
}
