import { defHttp } from '#/api/request';

export interface RecordDocument {
  fileExtension?: string;
  fileId: string;
  fileSize?: number | string;
  name: string;
}

export interface RecordCreated {
  document: RecordDocument;
  existing: boolean;
  recordId: string;
  revisionId: string;
}

export type RecordBatchItemStatus = 'CREATED' | 'EXISTING' | 'FAILED';

export interface RecordBatchItem {
  created?: RecordCreated;
  errorCode?: string;
  errorMessage?: string;
  status: RecordBatchItemStatus;
  testWorkItemId: string;
}

export interface RecordBatchCreated {
  items: RecordBatchItem[];
}

export interface SharedFillField {
  conflictingValues: boolean;
  dataType: string;
  defaultExcludedTestWorkItemIds: string[];
  fieldCode: string;
  fieldName: string;
  fieldVersionId: string;
  targetTestWorkItemIds: string[];
  unit?: string;
}

export interface SharedFillTarget {
  currentValues: Record<string, string | undefined>;
  eligible: boolean;
  errorCode?: string;
  errorMessage?: string;
  recordId?: string;
  recordVersion?: number;
  revisionId?: string;
  testWorkItemId: string;
  testWorkItemName?: string;
}

export interface SharedFillPreview {
  fields: SharedFillField[];
  previewToken: string;
  targets: SharedFillTarget[];
  testDefinitionCode: string;
  testDefinitionId: string;
  testDefinitionName?: string;
}

export interface SharedFillValueCommand {
  fieldVersionId: string;
  value: string;
}

export interface SharedFillTargetCommand {
  expectedRecordVersion: number;
  overwrite: boolean;
  overwriteReason?: string;
  recordId: string;
  testWorkItemId: string;
}

export interface SharedFillExecuteCommand {
  operationCode: string;
  previewToken: string;
  targets: SharedFillTargetCommand[];
  testWorkItemIds: string[];
  values: SharedFillValueCommand[];
}

export interface SharedFillTargetResult {
  errorCode?: string;
  errorMessage?: string;
  recalculatedCount: number;
  recordId: string;
  recordVersion: number;
  status: 'COMMITTED' | 'REJECTED' | 'UNCHANGED';
  testWorkItemId: string;
}

export interface SharedFilled {
  fieldVersionIds: string[];
  operationCode: string;
  targets: SharedFillTargetResult[];
}

interface ApiResult<T> {
  code: number;
  data: T;
  msg?: string;
}

const RECORD_PREFIX = '/api/eln/records';

export function getRecordByTestWorkItem(testWorkItemId: string) {
  return defHttp.get<ApiResult<RecordCreated>>({
    url: `${RECORD_PREFIX}/byTestWorkItem/${encodeURIComponent(testWorkItemId)}`,
  });
}

export function createRecordsBatch(data: { operationCode: string; testWorkItemIds: string[] }) {
  return defHttp.post<ApiResult<RecordBatchCreated>>({ data, url: `${RECORD_PREFIX}/batch` });
}

export function previewSharedFill(data: { testWorkItemIds: string[] }) {
  return defHttp.post<ApiResult<SharedFillPreview>>({ data, url: `${RECORD_PREFIX}/sharedFill/preview` });
}

export function executeSharedFill(data: SharedFillExecuteCommand) {
  return defHttp.post<ApiResult<SharedFilled>>({ data, url: `${RECORD_PREFIX}/sharedFill/execute` });
}
