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

export type FieldScope = 'GLOBAL' | 'TEMPLATE';
export type FieldVersionStatus = 'CANCELLED' | 'DRAFT' | 'PRE_RELEASE' | 'PUBLISHED';
export type FieldDataType = 'CHECKBOX' | 'DATE' | 'DATETIME' | 'DECIMAL' | 'SELECT' | 'TEXT' | 'TEXTAREA';
export type FieldBatchMode = 'BATCH_SHARED' | 'RECORD_PRIVATE';
export type FieldReadSource = 'LIMS_TASK' | 'NONE' | 'SYSTEM';
export type FieldEnabled = 'disabled' | 'enabled';

export interface FieldBinding {
  read: {
    property?: string;
    propertyRevision?: number;
    source: FieldReadSource;
  };
  write: {
    target: 'ELN_RECORD';
  };
}

export interface FieldVersionRule {
  binding: FieldBinding;
  danwei?: string;
  kongjianPeizhi?: Record<string, unknown>;
  piciMoshi: FieldBatchMode;
  recommendedCheckboxGroupCode?: string;
  recommendedCheckboxMaxSelected?: null | number;
  recommendedCheckboxMinSelected?: number;
  shifouBitian: 0 | 1;
  shujuLeixing: FieldDataType;
  ziduanMingcheng: string;
}

export interface FieldPageQuery {
  bizEnabled?: FieldEnabled;
  currentPage: number;
  keyword?: string;
  mubanBianhao?: string;
  pageSize: number;
  zuoyongFanwei?: FieldScope;
}

export interface FieldListItem {
  bizEnabled: FieldEnabled;
  dangqianBanbenHao?: number;
  dangqianZiduanBanbenId?: string;
  gengxinShijian?: string;
  id: string;
  mubanBianhao?: string;
  mubanYinyongShu: number;
  ziduanBianma: string;
  ziduanMingcheng?: string;
  zuixinFabuBanbenHao?: number;
  zuoyongFanwei: FieldScope;
}

export interface FieldVersion extends FieldVersionRule {
  banbenHao: number;
  bizStatus: FieldVersionStatus;
  chuangjianShijian?: string;
  gengxinShijian?: string;
  id: string;
  ziduanDingyiId: string;
  zuofeiYuanyin?: string;
}

export interface FieldDetail {
  beizhu?: string;
  bizEnabled: FieldEnabled;
  dangqianZiduanBanbenId?: string;
  id: string;
  mubanBianhao?: string;
  versions: FieldVersion[];
  ziduanBianma: string;
  zuoyongFanwei: FieldScope;
}

export interface ProviderProperty {
  dataType: FieldDataType;
  enabled: boolean;
  label: string;
  property: string;
  propertyRevision?: number;
  readOnly: boolean;
  source: Exclude<FieldReadSource, 'NONE'>;
}

export interface FieldPagination {
  currentPage: number;
  pageSize: number;
  total: number;
}

export interface FieldPage {
  list: FieldListItem[];
  pagination: FieldPagination;
}

export interface CreateFieldParams extends FieldVersionRule {
  beizhu?: string;
  zuoyongFanwei: 'GLOBAL';
}

export interface CreateFieldVersionParams {
  sourceVersionId: string;
}

export interface SwitchCurrentVersionParams {
  reason: string;
  versionId: string;
}

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

const FIELD_CATALOG_PREFIX = '/api/eln/fieldCatalog';

export function getFieldPage(data: FieldPageQuery) {
  return defHttp.get<ApiResult<FieldPage>>({ data, url: FIELD_CATALOG_PREFIX });
}

export function createField(data: CreateFieldParams) {
  return defHttp.post<ApiResult<FieldDetail>>({ data, url: FIELD_CATALOG_PREFIX });
}

export function getFieldDetail(id: string) {
  return defHttp.get<ApiResult<FieldDetail>>({ url: `${FIELD_CATALOG_PREFIX}/${id}` });
}

export function getProviderProperties(source: Exclude<FieldReadSource, 'NONE'>) {
  return defHttp.get<ApiResult<ProviderProperty[]>>({ data: { source }, url: `${FIELD_CATALOG_PREFIX}/providerProperties` });
}

export function suggestFieldCode(text: string) {
  return defHttp.post<ApiResult<{ code: string }>>({ data: { text }, url: `${FIELD_CATALOG_PREFIX}/codeSuggestions` });
}

export function createFieldVersion(fieldId: string, data: CreateFieldVersionParams) {
  return defHttp.post<ApiResult<FieldVersion>>({ data, url: `${FIELD_CATALOG_PREFIX}/${fieldId}/versions` });
}

export function updateFieldVersion(versionId: string, data: FieldVersionRule) {
  return defHttp.put<ApiResult<FieldVersion>>({ data, url: `${FIELD_CATALOG_PREFIX}/versions/${versionId}` });
}

export function preReleaseFieldVersion(versionId: string) {
  return defHttp.post<ApiResult<void>>({ url: `${FIELD_CATALOG_PREFIX}/versions/${versionId}/preRelease` });
}

export function publishFieldVersion(versionId: string) {
  return defHttp.post<ApiResult<void>>({ url: `${FIELD_CATALOG_PREFIX}/versions/${versionId}/publish` });
}

export function cancelFieldVersion(versionId: string, reason: string) {
  return defHttp.post<ApiResult<void>>({ data: { reason }, url: `${FIELD_CATALOG_PREFIX}/versions/${versionId}/cancel` });
}

export function switchCurrentFieldVersion(fieldId: string, data: SwitchCurrentVersionParams) {
  return defHttp.post<ApiResult<void>>({ data, url: `${FIELD_CATALOG_PREFIX}/${fieldId}/currentVersion` });
}

export function promoteFieldToGlobal(fieldId: string, reason: string) {
  return defHttp.post<ApiResult<void>>({ data: { reason }, url: `${FIELD_CATALOG_PREFIX}/${fieldId}/promoteGlobal` });
}

export function enableField(fieldId: string, reason: string) {
  return defHttp.post<ApiResult<void>>({ data: { reason }, url: `${FIELD_CATALOG_PREFIX}/${fieldId}/enable` });
}

export function disableField(fieldId: string, reason: string) {
  return defHttp.post<ApiResult<void>>({ data: { reason }, url: `${FIELD_CATALOG_PREFIX}/${fieldId}/disable` });
}
