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

export type DmsAction = 'CREATE' | 'DELETE' | 'READ' | 'UPDATE';
export type DmsPrincipalType = 'GROUP' | 'ORG' | 'POSITION' | 'ROLE' | 'USER';
export type DmsResourceScope = 'SELF' | 'SUBTREE';
export type DmsResourceType = 'DOCUMENT' | 'FILE_VERSION' | 'FOLDER';
export type DmsSourceType = 'MANUAL' | 'MIGRATION' | 'SYSTEM' | 'WORKFLOW';
export type DmsAccessExclusionStatus = 'ACTIVE' | 'EXPIRED' | 'PENDING' | 'REVOKED';

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

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

export interface DmsPermissionResource {
  checksumSha256?: string;
  createdAt: string;
  documentId?: string;
  documentName?: string;
  documentNo?: string;
  effectiveFrom?: string;
  effectiveTo?: string;
  fileName?: string;
  id: string;
  lifecycleStatus?: 'EFFECTIVE' | 'EXPIRED' | 'INVALIDATED' | 'OBSOLETE' | 'PENDING_EFFECTIVE' | 'REVOKED' | 'SUPERSEDED';
  mimeType?: string;
  name: string;
  parentId?: string;
  resourceType: DmsResourceType;
  sizeBytes?: number;
  sourceId: string;
  sourceType: string;
  versionLabel?: string;
  versionNo?: number;
}

export interface DmsPermissionGrant {
  actionCode: DmsAction;
  createdAt: string;
  grantReason?: string;
  id: string;
  includeChildOrgs: boolean;
  inherited: boolean;
  maxUseCount?: number;
  principalId: string;
  principalName?: string;
  principalType: DmsPrincipalType;
  remainingUseCount?: number;
  resourceId: string;
  resourceScope: DmsResourceScope;
  resourceType: DmsResourceType;
  revokeReason?: string;
  revokedAt?: string;
  revision: number;
  sourceId: string;
  sourceType: DmsSourceType;
  status: 'ACTIVE' | 'EXHAUSTED' | 'EXPIRED' | 'PENDING' | 'REVOKED';
  updatedAt: string;
  usedCount: number;
  validFrom: string;
  validTo?: string;
}

export interface DmsPermissionUsage {
  actionCode: DmsAction;
  actualResourceId: string;
  actualResourceType: DmsResourceType;
  id: number;
  operationId: string;
  permissionId: string;
  sessionExpiresAt?: string;
  usedAt: string;
  userId: string;
}

export interface DmsAccessExclusion {
  actionCode: 'READ';
  createdAt: string;
  excludeReason?: string;
  excludedById: string;
  excludedByType: string;
  id: string;
  resourceId: string;
  resourceType: Exclude<DmsResourceType, 'FOLDER'>;
  revokeReason?: string;
  revokedAt?: string;
  revokedById?: string;
  revokedByType?: string;
  revision: number;
  sourceId: string;
  sourceType: DmsSourceType;
  status: DmsAccessExclusionStatus;
  updatedAt: string;
  userId: string;
  userName?: string;
  validFrom: string;
  validTo?: string;
}

export interface DmsAccessExclusionItem {
  excludeReason?: string;
  resourceId: string;
  resourceType: Exclude<DmsResourceType, 'FOLDER'>;
  userId: string;
  validFrom?: string;
  validTo?: string;
}

export interface DmsAccessExclusionBatch {
  items: DmsAccessExclusionItem[];
  sourceId: string;
  sourceType: DmsSourceType;
}

export interface DmsFolderCreate {
  name: string;
  parentId: string;
  sourceId: string;
}

export interface DmsPrincipalOption {
  id: string;
  name: string;
}

export interface DmsGrantItem {
  actionCode: DmsAction;
  grantReason?: string;
  includeChildOrgs: boolean;
  maxUseCount?: number;
  principalId: string;
  principalType: DmsPrincipalType;
  resourceId: string;
  resourceScope: DmsResourceScope;
  resourceType: DmsResourceType;
  validFrom?: string;
  validTo?: string;
}

export interface DmsGrantBatch {
  items: DmsGrantItem[];
  sourceId: string;
  sourceType: DmsSourceType;
}

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

export function getPermissionAdminCapabilities() {
  return defHttp.get<DmsApiResult<{ permissionAdministrator: boolean }>>({ url: `${prefix}/permission-admin/capabilities` }, silentErrorOptions);
}

export function getPermissionResources(params: { cursor?: string; pageSize?: number; resourceType?: DmsResourceType }) {
  return defHttp.get<DmsApiResult<DmsCursorPage<DmsPermissionResource>>>({ url: `${prefix}/permission-resources`, params }, silentErrorOptions);
}

export function getPermissionResourceTree(params: { pageSize?: number; parentId?: string }) {
  return defHttp.get<DmsApiResult<DmsPermissionResource[]>>({ url: `${prefix}/permission-resources/tree`, params }, silentErrorOptions);
}

export function getPermissionResource(id: string) {
  return defHttp.get<DmsApiResult<DmsPermissionResource>>({ url: `${prefix}/permission-resources/${id}` }, silentErrorOptions);
}

export function createDmsFolder(data: DmsFolderCreate) {
  return defHttp.post<DmsApiResult<DmsPermissionResource>>({ url: `${prefix}/folders`, data }, silentErrorOptions);
}

export function getResourceGrants(id: string) {
  return defHttp.get<DmsApiResult<DmsPermissionGrant[]>>({ url: `${prefix}/permission-resources/${id}/grants` }, silentErrorOptions);
}

export function createPermissionGrant(data: DmsGrantBatch) {
  return defHttp.post<DmsApiResult<DmsPermissionGrant[]>>({ url: `${prefix}/permission-grants`, data }, silentErrorOptions);
}

export function getPermissionGrant(id: string) {
  return defHttp.get<DmsApiResult<DmsPermissionGrant>>({ url: `${prefix}/permission-grants/${id}` }, silentErrorOptions);
}

export function revokePermissionGrants(data: { permissionIds: string[]; reason: string }) {
  return defHttp.post<DmsApiResult<DmsPermissionGrant[]>>({ url: `${prefix}/permission-grants/revoke`, data }, silentErrorOptions);
}

export function getPermissionUsages(id: string, pageSize = 100) {
  return defHttp.get<DmsApiResult<DmsPermissionUsage[]>>({ url: `${prefix}/permission-grants/${id}/usages`, params: { pageSize } }, silentErrorOptions);
}

export function getAccessExclusions(params: { cursor?: string; pageSize?: number; resourceId?: string; userId?: string }) {
  return defHttp.get<DmsApiResult<DmsCursorPage<DmsAccessExclusion>>>({ url: `${prefix}/access-exclusions`, params }, silentErrorOptions);
}

export function createAccessExclusions(data: DmsAccessExclusionBatch) {
  return defHttp.post<DmsApiResult<DmsAccessExclusion[]>>({ url: `${prefix}/access-exclusions`, data }, silentErrorOptions);
}

export function revokeAccessExclusions(data: { exclusionIds: string[]; reason: string }) {
  return defHttp.post<DmsApiResult<DmsAccessExclusion[]>>({ url: `${prefix}/access-exclusions/revoke`, data }, silentErrorOptions);
}

export function getPermissionGroups(params: { keyword?: string; pageSize?: number }) {
  return defHttp.get<DmsApiResult<DmsPrincipalOption[]>>({ url: `${prefix}/permission-principals/groups`, params }, silentErrorOptions);
}
