/**
 * 文件转换工具类
 * 提供常用的文件格式转换功能
 */

/**
 * File对象转Base64 DataURL
 * @param {File|Blob} file 文件对象
 * @returns {Promise<string>} 返回Base64字符串的Promise
 */
export function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    if (!file) {
      reject(new Error('文件对象不能为空'));
      return;
    }
    
    const reader = new FileReader();
    reader.onload = (e) => {
      resolve(e.target.result);
    };
    reader.onerror = (error) => {
      reject(error);
    };
    reader.readAsDataURL(file);
  });
}

/**
 * Base64 DataURL转File对象
 * @param {string} base64 Base64数据URL字符串
 * @param {string} filename 文件名
 * @param {string} mimeType 文件MIME类型，默认为Excel类型
 * @returns {File|null} 返回File对象，失败时返回null
 */
export function base64ToFile(base64, filename, mimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
  try {
    if (!base64 || !filename) {
      console.warn('Base64或文件名不能为空');
      return null;
    }
    
    // 移除Base64数据URL的前缀，获取纯Base64数据
    const base64Data = base64.replace(/^data:.*?;base64,/, '');
    
    // 将base64转换为二进制数组
    const byteCharacters = atob(base64Data);
    const byteNumbers = new Array(byteCharacters.length);
    
    for (let i = 0; i < byteCharacters.length; i++) {
      byteNumbers[i] = byteCharacters.charCodeAt(i);
    }
    
    const byteArray = new Uint8Array(byteNumbers);
    
    // 创建Blob对象
    const blob = new Blob([byteArray], { type: mimeType });
    
    // 创建File对象
    const file = new File([blob], filename, { 
      type: mimeType,
      lastModified: Date.now()
    });
    
    return file;
  } catch (error) {
    console.error('Base64转File失败:', error);
    return null;
  }
}

/**
 * Base64转Blob对象
 * @param {string} base64 Base64数据URL字符串
 * @param {string} mimeType 文件MIME类型
 * @returns {Blob|null} 返回Blob对象，失败时返回null
 */
export function base64ToBlob(base64, mimeType = 'application/octet-stream') {
  try {
    if (!base64) {
      console.warn('Base64不能为空');
      return null;
    }
    
    const base64Data = base64.replace(/^data:.*?;base64,/, '');
    const byteCharacters = atob(base64Data);
    const byteNumbers = new Array(byteCharacters.length);
    
    for (let i = 0; i < byteCharacters.length; i++) {
      byteNumbers[i] = byteCharacters.charCodeAt(i);
    }
    
    const byteArray = new Uint8Array(byteNumbers);
    const blob = new Blob([byteArray], { type: mimeType });
    
    return blob;
  } catch (error) {
    console.error('Base64转Blob失败:', error);
    return null;
  }
}

/**
 * 下载Base64数据为文件
 * @param {string} base64 Base64数据URL
 * @param {string} filename 下载的文件名
 * @param {string} mimeType 文件MIME类型
 */
export function downloadBase64File(base64, filename, mimeType) {
  try {
    const file = base64ToFile(base64, filename, mimeType);
    if (file) {
      const url = URL.createObjectURL(file);
      const link = document.createElement('a');
      link.href = url;
      link.download = filename;
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      URL.revokeObjectURL(url);
    }
  } catch (error) {
    console.error('下载Base64文件失败:', error);
  }
}

/**
 * 常用文件MIME类型映射
 */
export const MIME_TYPES = {
  EXCEL: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  PDF: 'application/pdf',
  WORD: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  IMAGE_JPEG: 'image/jpeg',
  IMAGE_PNG: 'image/png',
  IMAGE_GIF: 'image/gif',
  TEXT: 'text/plain',
  JSON: 'application/json'
};

export default {
  fileToBase64,
  base64ToFile,
  base64ToBlob,
  downloadBase64File,
  MIME_TYPES
};