import { ContentTypeEnum } from '@vben/request';

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

export type DmsFileCenterMode = 'CURRENT' | 'HISTORICAL';

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

export interface DmsCursorPage<T> {
  hasMore: boolean;
  list: T[];
  nextCursor?: string;
}

export interface DmsFileCenterItem {
  checksumSha256?: string;
  createdAt: string;
  documentId?: string;
  documentNo?: string;
  documentType?: string;
  effectiveFrom?: string;
  effectiveTo?: string;
  fileName?: string;
  id: string;
  lifecycleStatus?: 'EFFECTIVE' | 'EXPIRED' | 'INVALIDATED' | 'OBSOLETE' | 'REVOKED' | 'SUPERSEDED';
  mimeType?: string;
  name: string;
  parentId?: string;
  preparedBy?: string;
  preparedOn?: string;
  resourceType: 'FILE_VERSION' | 'FOLDER';
  responsibleDeptId?: string;
  sizeBytes?: number;
  versionLabel?: string;
  versionNo?: number;
}

export interface DmsPermissionDecision {
  actionCode: 'CREATE' | 'DELETE' | 'READ' | 'UPDATE';
  allowed: boolean;
  reasonCode: string;
  resourceId: string;
  resourceType: 'DOCUMENT' | 'FILE_VERSION' | 'FOLDER';
}

export interface DmsFileUploadMetadata {
  documentName: string;
  documentNo: string;
  documentType: string;
  preparedBy: string;
  preparedOn: string;
  responsibleDeptId: string;
  versionLabel: string;
}

export interface DmsFileRevisionMetadata {
  preparedBy: string;
  preparedOn: string;
  revisionReason: string;
  versionLabel: string;
}

const prefix = '/api/dms';
const silentErrorOptions = { errorMessageMode: 'none' as const };

export function getRootFolders(params: { cursor?: string; pageSize?: number }) {
  return defHttp.get<DmsApiResult<DmsCursorPage<DmsFileCenterItem>>>({ url: `${prefix}/folders/root/children`, params }, silentErrorOptions);
}

export function getChildFolders(folderId: string, params: { cursor?: string; pageSize?: number }) {
  return defHttp.get<DmsApiResult<DmsCursorPage<DmsFileCenterItem>>>({ url: `${prefix}/folders/${folderId}/children`, params }, silentErrorOptions);
}

export function getFolderFiles(mode: DmsFileCenterMode, folderId: string, params: { cursor?: string; keyword?: string; pageSize?: number }) {
  const endpoint = mode === 'HISTORICAL' ? 'historical-versions' : 'documents';
  return defHttp.get<DmsApiResult<DmsCursorPage<DmsFileCenterItem>>>({ url: `${prefix}/folders/${folderId}/${endpoint}`, params }, silentErrorOptions);
}

export function getSharedFiles(mode: DmsFileCenterMode, params: { cursor?: string; pageSize?: number }) {
  return defHttp.get<DmsApiResult<DmsCursorPage<DmsFileCenterItem>>>(
    { url: `${prefix}/shared-documents`, params: { ...params, center: mode } },
    silentErrorOptions,
  );
}

export function evaluateFolderCreate(folderId: string) {
  return defHttp.post<DmsApiResult<DmsPermissionDecision>>(
    { url: `${prefix}/permission-decisions/evaluate`, data: { actionCode: 'CREATE', resourceId: folderId, resourceType: 'FOLDER' } },
    silentErrorOptions,
  );
}

export function evaluateDocumentUpdate(documentId: string) {
  return defHttp.post<DmsApiResult<DmsPermissionDecision>>(
    { url: `${prefix}/permission-decisions/evaluate`, data: { actionCode: 'UPDATE', resourceId: documentId, resourceType: 'DOCUMENT' } },
    silentErrorOptions,
  );
}

export function createFolder(data: { name: string; parentId: string; sourceId: string }) {
  return defHttp.post<DmsApiResult<DmsFileCenterItem>>({ url: `${prefix}/folders`, data }, silentErrorOptions);
}

export function uploadFile(folderId: string, sourceId: string, file: File, metadata: DmsFileUploadMetadata) {
  const data = new FormData();
  data.append('folderId', folderId);
  data.append('sourceId', sourceId);
  data.append('documentNo', metadata.documentNo);
  data.append('documentName', metadata.documentName);
  data.append('documentType', metadata.documentType);
  data.append('responsibleDeptId', metadata.responsibleDeptId);
  data.append('versionLabel', metadata.versionLabel);
  data.append('preparedBy', metadata.preparedBy);
  data.append('preparedOn', metadata.preparedOn);
  data.append('file', file);
  return defHttp.post<DmsApiResult<unknown>>(
    { url: '/api/file/Dms/Uploader', data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } },
    silentErrorOptions,
  );
}

export function reviseFile(documentId: string, baseFileVersionId: string, sourceId: string, file: File, metadata: DmsFileRevisionMetadata) {
  const data = new FormData();
  data.append('documentId', documentId);
  data.append('baseFileVersionId', baseFileVersionId);
  data.append('sourceId', sourceId);
  data.append('versionLabel', metadata.versionLabel);
  data.append('preparedBy', metadata.preparedBy);
  data.append('preparedOn', metadata.preparedOn);
  data.append('revisionReason', metadata.revisionReason);
  data.append('file', file);
  return defHttp.post<DmsApiResult<unknown>>(
    { url: '/api/file/Dms/Revisions', data, headers: { 'Content-Type': ContentTypeEnum.FORM_DATA } },
    silentErrorOptions,
  );
}
