import type { OfficeDocumentFile } from '#/components/GlobalOfficeDocumentModal/types';

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

export type TemplateStatus = 'DRAFT' | 'PUBLISHED';
export type TemplateEnabled = 'disabled' | 'enabled';
export type HealthSeverity = 'ERROR' | 'INFO' | 'WARNING';
export type TemplateHealthAction = 'CONFIRM_REMOVE' | 'LOCATE' | 'REPAIR';

export interface TemplatePageQuery {
  bizEnabled?: TemplateEnabled;
  bizStatus?: TemplateStatus;
  currentPage: number;
  keyword?: string;
  mubanBianhao?: string;
  mubanFenlei?: string;
  pageSize: number;
  versionScope?: 'ALL' | 'LATEST';
}

export interface TemplateCategoryTreeNode {
  children?: TemplateCategoryTreeNode[];
  f_id: string;
  fenlei_miaoshu?: string;
  fenlei_mingcheng: string;
  shangji_fenlei?: string;
}

export interface TemplateListItem {
  bizEnabled: TemplateEnabled;
  bizStatus: TemplateStatus;
  chuangjianShijian?: string;
  gengxinShijian?: string;
  id: string;
  jianyanXiangmu?: string;
  jianyanXiangmuMingcheng?: string;
  mubanBanben: string;
  mubanBianhao: string;
  mubanFenlei?: string;
  mubanFenleiMingcheng?: string;
  mubanFile?: OfficeDocumentFile[] | string;
  shengxiaoRiqi?: string;
  shifouDangqian?: boolean;
  ziduanShu?: number;
}

export interface TemplateCatalogItem {
  bizEnabled?: TemplateEnabled;
  bizStatus?: TemplateStatus;
  chuangjianShijian?: string;
  gengxinShijian?: string;
  jianyanXiangmu?: string;
  jianyanXiangmuMingcheng?: string;
  mubanBianhao: string;
  mubanFenlei?: string;
  mubanFenleiMingcheng?: string;
  shengxiaoMubanBanben?: string;
  shengxiaoMubanId?: string;
  shengxiaoRiqi?: string;
  ziduanShu?: number;
}

export interface TemplateDetail extends TemplateListItem {
  chuangjianRenyuan?: string;
  chuangjianRenyuanMingcheng?: string;
  laiyuanMubanId?: string;
  mubanMingcheng?: string;
  shengbanCaozuoBianma?: string;
  shiyanBuzhou?: string;
}

export interface TemplatePage {
  list: TemplateListItem[];
  pagination: { currentPage: number; pageSize: number; total: number };
}

export interface TemplateDirectoryPage {
  list: TemplateCatalogItem[];
  pagination: { currentPage: number; pageSize: number; total: number };
}

export interface CreateTemplateVersionParams {
  mubanBanben: string;
  shengbanCaozuoBianma: string;
  shengxiaoRiqi: string;
}

export interface HealthDependency {
  code?: string;
  label?: string;
  message: string;
}

export interface TemplateHealthDiagnostic {
  actions?: TemplateHealthAction[];
  bindingId?: string;
  code: string;
  controlTag?: string;
  dependencies?: HealthDependency[];
  expectedVersion?: number;
  fieldDisplayName?: string;
  message: string;
  partName?: string;
  severity: HealthSeverity;
}

export interface TemplateHealthReport {
  diagnostics: TemplateHealthDiagnostic[];
  fileId: string;
  templateId: string;
}

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

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

export interface SaveTemplateStepsParams {
  stepMigrations: Record<string, string>;
  steps: Array<{ id?: string; name: string }>;
}

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

const TEMPLATE_CATALOG_PREFIX = '/api/eln/templateCatalog';
const TEMPLATE_CATEGORY_TREE_INTERFACE_ID = '855428577502430981';

export function getTemplateCategoryTree() {
  return defHttp.post<ApiResult<string | TemplateCategoryTreeNode[]>>({
    data: { paramList: [{ field: 'currentId', sourceType: 3 }] },
    url: `/api/system/DataInterface/${TEMPLATE_CATEGORY_TREE_INTERFACE_ID}/Actions/Preview`,
  });
}

export function getTemplatePage(data: TemplatePageQuery) {
  return defHttp.get<ApiResult<TemplatePage>>({ data, url: TEMPLATE_CATALOG_PREFIX });
}

export function getTemplateDirectory(data: TemplatePageQuery) {
  return defHttp.get<ApiResult<TemplateDirectoryPage>>({ data, url: `${TEMPLATE_CATALOG_PREFIX}/directory` });
}

export function getTemplateDetail(templateId: string) {
  return defHttp.get<ApiResult<TemplateDetail>>({ url: `${TEMPLATE_CATALOG_PREFIX}/${templateId}` });
}

export function createTemplateVersion(sourceTemplateId: string, data: CreateTemplateVersionParams) {
  return defHttp.post<ApiResult<TemplateDetail>>({ data, url: `${TEMPLATE_CATALOG_PREFIX}/${sourceTemplateId}/versions` }, { errorMessageMode: 'none' });
}

export function getTemplateHealth(templateId: string) {
  return defHttp.get<ApiResult<TemplateHealthReport>>({ url: `${TEMPLATE_CATALOG_PREFIX}/${templateId}/health` });
}

export function getTemplateSteps(templateId: string) {
  return defHttp.get<ApiResult<TemplateStepConfiguration>>({ url: `${TEMPLATE_CATALOG_PREFIX}/${templateId}/steps` });
}

export function saveTemplateSteps(templateId: string, data: SaveTemplateStepsParams) {
  return defHttp.put<ApiResult<TemplateStepConfiguration>>({ data, url: `${TEMPLATE_CATALOG_PREFIX}/${templateId}/steps` });
}

export function publishTemplate(templateId: string, reason?: string) {
  return defHttp.post<ApiResult<void>>({ data: { reason }, url: `${TEMPLATE_CATALOG_PREFIX}/${templateId}/publish` }, { errorMessageMode: 'none' });
}

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

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

export function switchCurrentTemplate(templateCode: string, templateId: string, reason: string) {
  return defHttp.post<ApiResult<void>>({
    data: { reason, templateCode, templateId },
    url: `${TEMPLATE_CATALOG_PREFIX}/currentVersion`,
  });
}

export function confirmRemoveMissing(bindingId: string, data: { clientReportedMissing: true; expectedVersion: number; operationCode: string; reason: string }) {
  return defHttp.post<ApiResult<void>>({ data, url: `${TEMPLATE_CATALOG_PREFIX}/bindings/${bindingId}/confirmRemoveMissing` });
}
