import type { DmsApiResult, DmsPermissionResource } from './permission';
import type { DmsWatermarkParameters } from './watermarkParameters';

import { v4 as uuidv4 } from 'uuid';

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

import { watermarkParameters } from './watermarkParameters';

export type DmsPersonalFolderType = 'BORROW' | 'DOWNLOAD' | 'FAVORITE';

export interface DmsPersonalFolder {
  code: DmsPersonalFolderType;
  name: string;
}

export interface DmsPersonalFolderFile extends DmsPermissionResource {
  validTo?: string;
}

export interface DmsFileDownloadTicket {
  accessTicket: string;
  expiresAt: string;
  fileName: string;
  fileVersionId: string;
  mimeType?: string;
  sizeBytes?: number;
}

export interface DmsDownloadDecision {
  allowed: boolean;
  resourceId: string;
}

export interface DmsPersonalFolderAddResult {
  addedCount: number;
  requestedCount: number;
}

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

export function getPersonalFolders() {
  return defHttp.get<DmsApiResult<DmsPersonalFolder[]>>({ url: prefix }, silentErrorOptions);
}

export function getPersonalFolderFiles(folderType: DmsPersonalFolderType, params: { keyword?: string; pageSize?: number }) {
  return defHttp.get<DmsApiResult<DmsPersonalFolderFile[]>>({ url: `${prefix}/${folderType}/files`, params }, silentErrorOptions);
}

export function evaluatePersonalFolderDownloads(fileVersionIds: string[]) {
  return defHttp.post<DmsApiResult<DmsDownloadDecision[]>>(
    {
      url: '/api/dms/permission-decisions/batch-evaluate',
      data: {
        requests: fileVersionIds.map((resourceId) => ({ actionCode: 'DOWNLOAD', resourceId, resourceType: 'FILE_VERSION', workflowDownloadOnly: true })),
      },
    },
    silentErrorOptions,
  );
}

export function addFavoriteFile(data: { documentId: string; fileVersionId: string; operationId: string }) {
  return defHttp.post<DmsApiResult<DmsPersonalFolderAddResult>>({ url: `${prefix}/favorite/files`, data }, silentErrorOptions);
}

export function createDmsFileDownloadTicket(fileVersionId: string, options?: DmsWatermarkParameters) {
  return defHttp.post<DmsApiResult<DmsFileDownloadTicket>>(
    {
      url: '/api/dms/file-download-tickets',
      data: {
        ...watermarkParameters(options),
        operationId: uuidv4(),
        workflowDownloadOnly: true,
        resourceId: fileVersionId,
        resourceType: 'FILE_VERSION',
      },
    },
    silentErrorOptions,
  );
}

export function downloadDmsFile(fileVersionId: string, accessTicket: string, format?: 'pdf') {
  return defHttp.get<Blob>(
    {
      url: `/api/file/Dms/Download/${fileVersionId}`,
      params: { ticket: accessTicket, ...(format ? { format } : {}) },
      responseType: 'blob',
      ...(format === 'pdf' ? { timeout: 300_000 } : {}),
    },
    { errorMessageMode: 'none', isTransformResponse: false },
  );
}
