import * as XLSX from 'xlsx'
import { saveAs } from 'file-saver'

/**
 * 通用Excel导出工具类
 */
export class ExportUtils {
  /**
   * 导出数据到Excel文件
   * @param {Array} data - 要导出的数据数组
   * @param {Array} columns - 列配置数组
   * @param {String} filename - 文件名（不包含扩展名）
   * @param {String} sheetName - 工作表名称，默认为'Sheet1'
   */
  static exportToExcel(data, columns, filename, sheetName = 'Sheet1') {
    try {
      // 验证参数
      if (!Array.isArray(data)) {
        throw new Error('数据必须是数组格式')
      }
      if (!Array.isArray(columns)) {
        throw new Error('列配置必须是数组格式')
      }
      if (!filename) {
        throw new Error('文件名不能为空')
      }

      // 准备Excel数据
      const excelData = this.prepareExcelData(data, columns)
      
      // 创建工作簿
      const workbook = XLSX.utils.book_new()
      
      // 创建工作表
      const worksheet = XLSX.utils.aoa_to_sheet(excelData)
      
      // 设置列宽
      const colWidths = this.calculateColumnWidths(excelData)
      worksheet['!cols'] = colWidths
      
      // 添加工作表到工作簿
      XLSX.utils.book_append_sheet(workbook, worksheet, sheetName)
      
      // 生成Excel文件并下载
      const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })
      const blob = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
      
      // 添加时间戳到文件名
      const timestamp = new Date().toISOString().slice(0, 19).replace(/[-:]/g, '').replace('T', '_')
      const finalFilename = `${filename}_${timestamp}.xlsx`
      
      saveAs(blob, finalFilename)
      
      return {
        success: true,
        message: '导出成功',
        filename: finalFilename
      }
  } catch (error) {
      console.error('导出Excel失败:', error)
      return {
        success: false,
        message: `导出失败: ${error.message}`,
        error: error
      }
  }
}

/**
   * 准备Excel数据格式
   */
  static prepareExcelData(data, columns) {
    // 第一行：列标题
    const headers = columns.map(col => col.title || col.dataIndex || col.key)
    const excelData = [headers]
    
    // 数据行
    data.forEach(item => {
      const row = columns.map(col => {
        const fieldName = col.dataIndex || col.key
        let value = item[fieldName]
        
        // 处理特殊数据类型
        if (value === null || value === undefined) {
          return ''
        }
        
        // 处理日期时间
        if (col.dataType === 'datetime' && value) {
          return new Date(value).toLocaleString('zh-CN')
        }
        
        // 处理布尔值
        if (typeof value === 'boolean') {
          return value ? '是' : '否'
        }
        
        // 处理数组
        if (Array.isArray(value)) {
          return value.join(', ')
        }
        
        // 处理对象
        if (typeof value === 'object') {
          return JSON.stringify(value)
        }
        
        return String(value)
      })
      excelData.push(row)
    })
    
    return excelData
  }

  /**
   * 计算列宽
   */
  static calculateColumnWidths(excelData) {
    if (!excelData || excelData.length === 0) return []
    
    const colCount = excelData[0].length
    const colWidths = []
    
    for (let i = 0; i < colCount; i++) {
      let maxWidth = 10 // 最小宽度
      
      excelData.forEach(row => {
        if (row[i]) {
          const cellWidth = String(row[i]).length
          maxWidth = Math.max(maxWidth, cellWidth)
        }
      })
      
      // 限制最大宽度
      colWidths.push({ wch: Math.min(maxWidth + 2, 50) })
    }
    
    return colWidths
  }

  /**
   * 导出智能设备数据
   */
  static exportDeviceData(data, deviceType) {
    const deviceTypeMap = {
      collar: { name: '智能项圈', columns: this.getCollarColumns() },
      eartag: { name: '智能耳标', columns: this.getEartagColumns() },
      host: { name: '智能主机', columns: this.getHostColumns() }
    }
    
    const config = deviceTypeMap[deviceType]
    if (!config) {
      throw new Error(`不支持的设备类型: ${deviceType}`)
    }
    
    return this.exportToExcel(data, config.columns, config.name + '数据')
  }

  /**
   * 导出预警数据
   */
  static exportAlertData(data, alertType) {
    const alertTypeMap = {
      collar: { name: '智能项圈预警', columns: this.getCollarAlertColumns() },
      eartag: { name: '智能耳标预警', columns: this.getEartagAlertColumns() }
    }
    
    const config = alertTypeMap[alertType]
    if (!config) {
      throw new Error(`不支持的预警类型: ${alertType}`)
    }
    
    return this.exportToExcel(data, config.columns, config.name + '数据')
  }

  /**
   * 导出牛只档案数据
   */
  static exportCattleData(data) {
    return this.exportToExcel(data, this.getCattleColumns(), '牛只档案数据')
  }

  /**
   * 导出动物数据（别名方法，与exportCattleData相同）
   */
  static exportAnimalsData(data) {
    return this.exportCattleData(data)
  }

  /**
   * 导出栏舍数据
   */
  static exportPenData(data) {
    return this.exportToExcel(data, this.getPenColumns(), '栏舍数据')
  }

  /**
   * 导出批次数据
   */
  static exportBatchData(data) {
    return this.exportToExcel(data, this.getBatchColumns(), '批次数据')
  }

  /**
   * 导出转栏记录数据
   */
  static exportTransferData(data) {
    return this.exportToExcel(data, this.getTransferColumns(), '转栏记录数据')
  }

  /**
   * 导出离栏记录数据
   */
  static exportExitData(data) {
    return this.exportToExcel(data, this.getExitColumns(), '离栏记录数据')
  }

  /**
   * 导出养殖场数据
   */
  static exportFarmData(data) {
    return this.exportToExcel(data, this.getFarmColumns(), '养殖场数据')
  }

  /**
   * 导出用户数据
   */
  static exportUserData(data) {
    return this.exportToExcel(data, this.getUserColumns(), '用户数据')
  }

  // 列配置定义
  static getCollarColumns() {
    return [
      { title: '设备ID', dataIndex: 'id', key: 'id' },
      { title: '设备名称', dataIndex: 'device_name', key: 'device_name' },
      { title: '设备编号', dataIndex: 'device_code', key: 'device_code' },
      { title: '设备状态', dataIndex: 'status', key: 'status' },
      { title: '电量', dataIndex: 'battery_level', key: 'battery_level' },
      { title: '信号强度', dataIndex: 'signal_strength', key: 'signal_strength' },
      { title: '最后在线时间', dataIndex: 'last_online', key: 'last_online', dataType: 'datetime' },
      { title: '创建时间', dataIndex: 'created_at', key: 'created_at', dataType: 'datetime' }
    ]
  }

  static getEartagColumns() {
    return [
      { title: '设备ID', dataIndex: 'id', key: 'id' },
      { title: '耳标编号', dataIndex: 'eartagNumber', key: 'eartagNumber' },
      { title: '设备状态', dataIndex: 'deviceStatus', key: 'deviceStatus' },
      { title: '电量/%', dataIndex: 'battery', key: 'battery' },
      { title: '设备温度/°C', dataIndex: 'temperature', key: 'temperature' },
      { title: '被采集主机', dataIndex: 'collectedHost', key: 'collectedHost' },
      { title: '总运动量', dataIndex: 'totalMovement', key: 'totalMovement' },
      { title: '当日运动量', dataIndex: 'dailyMovement', key: 'dailyMovement' },
      { title: '定位信息', dataIndex: 'location', key: 'location' },
      { title: '数据最后更新时间', dataIndex: 'lastUpdate', key: 'lastUpdate', dataType: 'datetime' },
      { title: '绑定牲畜', dataIndex: 'bindingStatus', key: 'bindingStatus' },
      { title: 'GPS信号强度', dataIndex: 'gpsSignal', key: 'gpsSignal' },
      { title: '经度', dataIndex: 'longitude', key: 'longitude' },
      { title: '纬度', dataIndex: 'latitude', key: 'latitude' }
    ]
  }

  static getHostColumns() {
    return [
      { title: '设备ID', dataIndex: 'id', key: 'id' },
      { title: '设备名称', dataIndex: 'title', key: 'title' },
      { title: '设备编号', dataIndex: 'deviceNumber', key: 'deviceNumber' },
      { title: '设备状态', dataIndex: 'networkStatus', key: 'networkStatus' },
      { title: 'IP地址', dataIndex: 'simId', key: 'simId' },
      { title: '端口', dataIndex: 'signalValue', key: 'signalValue' },
      { title: '最后在线时间', dataIndex: 'updateTime', key: 'updateTime', dataType: 'datetime' },
      { title: '创建时间', dataIndex: 'voltage', key: 'voltage' },
      { title: '设备电量', dataIndex: 'battery', key: 'battery' },
      { title: '设备温度', dataIndex: 'temperature', key: 'temperature' },
      { title: 'GPS状态', dataIndex: 'gpsStatus', key: 'gpsStatus' },
      { title: '经度', dataIndex: 'longitude', key: 'longitude' },
      { title: '纬度', dataIndex: 'latitude', key: 'latitude' }
    ]
  }

  static getCollarAlertColumns() {
    return [
      { title: '耳标编号', dataIndex: 'collarNumber', key: 'collarNumber' },
      { title: '预警类型', dataIndex: 'alertType', key: 'alertType' },
      { title: '预警级别', dataIndex: 'alertLevel', key: 'alertLevel' },
      { title: '预警时间', dataIndex: 'alertTime', key: 'alertTime', dataType: 'datetime' },
      { title: '设备电量', dataIndex: 'battery', key: 'battery' },
      { title: '设备温度', dataIndex: 'temperature', key: 'temperature' },
      { title: '当日步数', dataIndex: 'dailySteps', key: 'dailySteps' }
    ]
  }

  static getEartagAlertColumns() {
    return [
      { title: '设备编号', dataIndex: 'device_name', key: 'device_name' },
      { title: '预警类型', dataIndex: 'alert_type', key: 'alert_type' },
      { title: '预警级别', dataIndex: 'alert_level', key: 'alert_level' },
      { title: '预警内容', dataIndex: 'alert_content', key: 'alert_content' },
      { title: '预警时间', dataIndex: 'alert_time', key: 'alert_time', dataType: 'datetime' },
      { title: '处理状态', dataIndex: 'status', key: 'status' },
      { title: '处理人', dataIndex: 'handler', key: 'handler' }
    ]
  }

  static getCattleColumns() {
    return [
      { title: '牛只ID', dataIndex: 'id', key: 'id' },
      { title: '耳标号', dataIndex: 'ear_tag', key: 'ear_tag' },
      { title: '智能佩戴设备', dataIndex: 'device_id', key: 'device_id' },
      { title: '出生日期', dataIndex: 'birth_date', key: 'birth_date', dataType: 'datetime' },
      { title: '月龄', dataIndex: 'age_in_months', key: 'age_in_months' },
      { title: '品类', dataIndex: 'category', key: 'category' },
      { title: '品种', dataIndex: 'breed', key: 'breed' },
      { title: '生理阶段', dataIndex: 'physiological_stage', key: 'physiological_stage' },
      { title: '性别', dataIndex: 'gender', key: 'gender' },
      { title: '出生体重(KG)', dataIndex: 'birth_weight', key: 'birth_weight' },
      { title: '现估值(KG)', dataIndex: 'current_weight', key: 'current_weight' },
      { title: '代数', dataIndex: 'generation', key: 'generation' },
      { title: '血统纯度', dataIndex: 'bloodline_purity', key: 'bloodline_purity' },
      { title: '入场日期', dataIndex: 'entry_date', key: 'entry_date', dataType: 'datetime' },
      { title: '栏舍', dataIndex: 'pen_name', key: 'pen_name' },
      { title: '已产胎次', dataIndex: 'calvings', key: 'calvings' },
      { title: '来源', dataIndex: 'source', key: 'source' },
      { title: '冻精编号', dataIndex: 'frozen_semen_number', key: 'frozen_semen_number' }
    ]
  }

  static getPenColumns() {
    return [
      { title: '栏舍ID', dataIndex: 'id', key: 'id' },
      { title: '栏舍名', dataIndex: 'name', key: 'name' },
      { title: '动物类型', dataIndex: 'animal_type', key: 'animal_type' },
      { title: '栏舍类型', dataIndex: 'pen_type', key: 'pen_type' },
      { title: '负责人', dataIndex: 'responsible', key: 'responsible' },
      { title: '容量', dataIndex: 'capacity', key: 'capacity' },
      { title: '状态', dataIndex: 'status', key: 'status' },
      { title: '创建人', dataIndex: 'creator', key: 'creator' },
      { title: '创建时间', dataIndex: 'created_at', key: 'created_at', dataType: 'datetime' }
    ]
  }

  static getBatchColumns() {
    return [
      { title: '批次ID', dataIndex: 'id', key: 'id' },
      { title: '批次名称', dataIndex: 'batch_name', key: 'batch_name' },
      { title: '批次类型', dataIndex: 'batch_type', key: 'batch_type' },
      { title: '目标数量', dataIndex: 'target_count', key: 'target_count' },
      { title: '当前数量', dataIndex: 'current_count', key: 'current_count' },
      { title: '创建时间', dataIndex: 'created_at', key: 'created_at', dataType: 'datetime' },
      { title: '负责人', dataIndex: 'manager', key: 'manager' },
      { title: '状态', dataIndex: 'status', key: 'status' }
    ]
  }

  static getTransferColumns() {
    return [
      { title: '记录ID', dataIndex: 'id', key: 'id' },
      { title: '牛只耳标', dataIndex: 'ear_tag', key: 'ear_tag' },
      { title: '原栏舍', dataIndex: 'from_pen', key: 'from_pen' },
      { title: '目标栏舍', dataIndex: 'to_pen', key: 'to_pen' },
      { title: '转栏时间', dataIndex: 'transfer_time', key: 'transfer_time', dataType: 'datetime' },
      { title: '转栏原因', dataIndex: 'reason', key: 'reason' },
      { title: '操作人', dataIndex: 'operator', key: 'operator' }
    ]
  }

  static getExitColumns() {
    return [
      { title: '记录ID', dataIndex: 'id', key: 'id' },
      { title: '牛只耳标', dataIndex: 'ear_tag', key: 'ear_tag' },
      { title: '原栏舍', dataIndex: 'from_pen', key: 'from_pen' },
      { title: '离栏时间', dataIndex: 'exit_time', key: 'exit_time', dataType: 'datetime' },
      { title: '离栏原因', dataIndex: 'exit_reason', key: 'exit_reason' },
      { title: '去向', dataIndex: 'destination', key: 'destination' },
      { title: '操作人', dataIndex: 'operator', key: 'operator' }
    ]
  }

  static getFarmColumns() {
    return [
      { title: '养殖场ID', dataIndex: 'id', key: 'id' },
      { title: '养殖场名称', dataIndex: 'name', key: 'name' },
      { title: '地址', dataIndex: 'address', key: 'address' },
      { title: '联系电话', dataIndex: 'phone', key: 'phone' },
      { title: '负责人', dataIndex: 'contact', key: 'contact' },
      { title: '面积', dataIndex: 'area', key: 'area' },
      { title: '状态', dataIndex: 'status', key: 'status' },
      { title: '创建时间', dataIndex: 'createdAt', key: 'createdAt', dataType: 'datetime' }
    ]
  }

  static getUserColumns() {
    return [
      { title: '用户ID', dataIndex: 'id', key: 'id' },
      { title: '用户名', dataIndex: 'username', key: 'username' },
      { title: '邮箱', dataIndex: 'email', key: 'email' },
      { title: '角色', dataIndex: 'roleName', key: 'roleName' },
      { title: '状态', dataIndex: 'status', key: 'status' },
      { title: '最后登录', dataIndex: 'last_login', key: 'last_login', dataType: 'datetime' },
      { title: '创建时间', dataIndex: 'created_at', key: 'created_at', dataType: 'datetime' }
    ]
  }

  // 其他导出方法（为了兼容性）
  static exportFarmsData(data) {
    return this.exportFarmData(data)
  }

  static exportAlertsData(data) {
    return this.exportAlertData(data, 'collar') // 默认使用collar类型
  }

  static exportDevicesData(data) {
    return this.exportDeviceData(data, 'collar') // 默认使用collar类型
  }

  static exportOrdersData(data) {
    return this.exportToExcel(data, this.getOrderColumns(), '订单数据')
  }

  static exportProductsData(data) {
    return this.exportToExcel(data, this.getProductColumns(), '产品数据')
  }

  static getOrderColumns() {
    return [
      { title: '订单ID', dataIndex: 'id', key: 'id' },
      { title: '订单号', dataIndex: 'order_number', key: 'order_number' },
      { title: '客户名称', dataIndex: 'customer_name', key: 'customer_name' },
      { title: '订单金额', dataIndex: 'total_amount', key: 'total_amount' },
      { title: '订单状态', dataIndex: 'status', key: 'status' },
      { title: '创建时间', dataIndex: 'created_at', key: 'created_at', dataType: 'datetime' }
    ]
  }

  static getProductColumns() {
    return [
      { title: '产品ID', dataIndex: 'id', key: 'id' },
      { title: '产品名称', dataIndex: 'name', key: 'name' },
      { title: '产品类型', dataIndex: 'type', key: 'type' },
      { title: '价格', dataIndex: 'price', key: 'price' },
      { title: '库存', dataIndex: 'stock', key: 'stock' },
      { title: '状态', dataIndex: 'status', key: 'status' },
      { title: '创建时间', dataIndex: 'created_at', key: 'created_at', dataType: 'datetime' }
    ]
  }
}

export default ExportUtils