/**
 * 文件上传组件 - 类型定义
 *
 * 复用位置：议程项上传资料、会议级资料上传
 */

export type UploadItemStatus =
  | 'queued'
  | 'uploading'
  | 'success'
  | 'failed'
  | 'cancelled';

/** 队列中一个文件的状态 */
export interface UploadQueueItem {
  /** 客户端唯一 id（随机生成，不是后端返回的 attachment.id） */
  id: string;
  file: File;
  status: UploadItemStatus;
  /** 0-100 整数 */
  progress: number;
  /** 已上传字节 */
  loaded: number;
  /** 校验错误码（前端先校验） */
  validateError?: 'ATTACHMENT_TOO_LARGE' | 'ATTACHMENT_MIME_NOT_ALLOWED';
  /** 上传过程中后端返回的错误码（如 ATTACHMENT_MIME_MISMATCH / UPLOAD_TASK_NOT_OWNED 等） */
  uploadError?: string;
  /** 失败的兜底文案（用于 i18n key 不命中时降级展示） */
  uploadErrorMessage?: string;
  /** 用于取消正在进行的请求 */
  abortController?: AbortController;
}

/** 单文件上传执行器（具体由调用方注入，避免组件被业务耦合） */
export type SingleUploader = (
  file: File,
  options: { onProgress: (percent: number) => void; signal: AbortSignal },
) => Promise<void>;
