// ============================================================
// media-upload — 媒体上传共享工具
//
// 合并自：
//   1. src/pages/home/controls/media-upload-utils.ts
//   2. VideoInput.tsx 中的 createVideoBeforeUpload / buildVideoAccept
//
// 使用者：ImageInput / ImageListInput / VideoInput / AudioListInput
// ============================================================

import { message, Upload } from 'antd';
import type { RcFile } from 'antd/es/upload';

/** 常见视频扩展名 */
export const VIDEO_EXTENSIONS = new Set(['mp4', 'webm', 'mov', 'avi', 'mkv', 'flv', 'wmv']);

// ========== accept 字符串构建 ==========

/**
 * 构建媒体文件 accept 字符串，自动区分 image/ video/ 前缀。
 * @example
 *   buildAccept(['png', 'jpg'])  → "image/png,image/jpg"
 *   buildAccept(['mp4', 'webm']) → "video/mp4,video/webm"
 *   buildAccept([])              → "image/png,image/jpg,image/jpeg,image/webp"
 */
export function buildAccept(filters?: string[]): string {
   if (!filters || filters.length === 0) return 'image/png,image/jpg,image/jpeg,image/webp';
   return filters.map((ext) => {
      if (VIDEO_EXTENSIONS.has(ext.toLowerCase())) return `video/${ext}`;
      return `image/${ext}`;
   }).join(',');
}

/** 构建视频 accept 字符串 */
export function buildVideoAccept(filters?: string[]): string {
   if (!filters || filters.length === 0) return 'video/mp4,video/webm,video/quicktime,video/x-msvideo';
   return filters.map((ext) => `video/${ext}`).join(',');
}

// ========== beforeUpload 校验工厂 ==========

/**
 * 创建上传前的类型 & 大小校验函数（ImageInput / ImageListInput 共用）。
 * 当 file_filter 包含视频扩展名时，自动放行 video/* MIME。
 */
export function createMediaBeforeUpload(maxSizeMb: number = 10, filters?: string[]) {
   const hasVideoFilters = filters?.some(f => VIDEO_EXTENSIONS.has(f.toLowerCase()));

   return (file: RcFile) => {
      const isImage = file.type.startsWith('image/');
      const isVideo = file.type.startsWith('video/');

      if (isVideo && hasVideoFilters) {
         if (file.size / 1024 / 1024 >= maxSizeMb) {
            message.error(`视频大小不能超过 ${maxSizeMb}MB`);
            return Upload.LIST_IGNORE;
         }
         return true;
      }

      if (!isImage) {
         message.error(hasVideoFilters ? '只能上传图片或视频文件' : '只能上传图片文件');
         return Upload.LIST_IGNORE;
      }

      if (file.size / 1024 / 1024 >= maxSizeMb) {
         message.error(`图片大小不能超过 ${maxSizeMb}MB`);
         return Upload.LIST_IGNORE;
      }
      return true;
   };
}

/**
 * 创建视频上传前的类型 & 大小校验函数（VideoInput 用）。
 */
export function createVideoBeforeUpload(maxSizeMb: number = 50) {
   return (file: RcFile) => {
      if (!file.type.startsWith('video/')) {
         message.error('只能上传视频文件');
         return Upload.LIST_IGNORE;
      }
      if (file.size / 1024 / 1024 >= maxSizeMb) {
         message.error(`视频大小不能超过 ${maxSizeMb}MB`);
         return Upload.LIST_IGNORE;
      }
      return true;
   };
}
