/**
 * CRMEB XLSX/Excel 适配器
 * 
 * 处理CRMEB后台导出的Excel商品数据文件
 * CRMEB后台 → 商品 → 商品管理 → 导出 → xlsx文件
 * 
 * 兼容常见的CRMEB Excel导出列名格式
 */

const PlatformAdapter = require('../adapter');
const XLSX = require('xlsx');

class CrmeBXlsxAdapter extends PlatformAdapter {
  constructor() {
    super({
      name: 'crmeB-xlsx',
      label: 'CRMEB Excel导出',
      version: '1.0',
      description: '从CRMEB后台导出的Excel表格导入商品',
      icon: '📊',
      formats: ['xlsx', 'xls'],
    });

    // CRMEB Excel常见列名映射
        this.fieldMap = [
      // 商品名称
      { patterns: ['商品名称', '商品名', '名称', 'name', 'store_name', 'goods_name', '产品名称'], target: 'name' },
      // 商品编号/ID
      { patterns: ['商品编号', '编号', '商品ID', 'id', 'product_id'], target: 'id', transform: v => String(v) },
      // 分类
      { patterns: ['分类', '类目', 'category', '分类名称', 'cate_name', 'cate_id'], target: 'category_name' },
      // 价格
      { patterns: ['价格', '售价', '销售价', 'price', 'shop_price', 'sell_price'], target: 'price', transform: v => parseFloat(v) || 0 },
      // 原价
      { patterns: ['原价', '市场价', '原价格', 'ot_price', 'market_price', 'original_price'], target: 'original_price', transform: v => parseFloat(v) || 0 },
      // 成本价
      { patterns: ['成本价', '成本', 'cost', 'cost_price'], target: 'cost_price', transform: v => parseFloat(v) || 0 },
      // 库存
      { patterns: ['库存', '数量', '库存数量', 'stock', 'quantity', 'num', 'store_count'], target: 'stock', transform: v => parseInt(v) || 0 },
      // 销量
      { patterns: ['销量', '已售', '销售量', 'sales', 'sold', 'sold_quantity', 'sales_actual'], target: 'sales', transform: v => parseInt(v) || 0 },
      // 主图
      { patterns: ['图片', '主图', '图片地址', '封面图', 'image', 'thumb', 'cover'], target: 'image' },
      // 轮播图
      { patterns: ['轮播图', '详情图', '图集', '相册', 'slider_image', 'images', 'gallery', 'banner'], target: 'images' },
      // 描述
      { patterns: ['描述', '商品描述', '详情', '说明', 'description', 'intro', 'content', 'detail'], target: 'description' },
      // 单位
      { patterns: ['单位', 'unit', 'unit_name'], target: 'unit', transform: v => v || '件' },
      // 排序
      { patterns: ['排序', '权重', 'sort', 'weigh', 'order'], target: 'sort', transform: v => parseInt(v) || 0 },
      // 状态
      { patterns: ['状态', '上架', 'status', 'is_show', 'is_shelves'], target: 'status', transform: v => {
        if (v === '上架' || v === '启用' || v === '是') return 1;
        if (v === '下架' || v === '禁用' || v === '否') return 0;
        return (v === 1 || v === '1' || v === true) ? 1 : 0;
      }},
    ];
  }

  /**
   * 检测是否为CRMEB或其他商城导出的Excel
   */
  detect(input) {
    const content = input.content || '';
    if (!content) return 0;
    
    // xlsx是二进制，通过文件名或特征检测
    if (input.type === 'xlsx' || input.type === 'xls') {
      // 有文件内容，尝试解析前几行检测
      try {
        const workbook = XLSX.read(content, { type: this._getInputType(content) });
        const sheet = workbook.Sheets[workbook.SheetNames[0]];
        const json = XLSX.utils.sheet_to_json(sheet, { header: 1, defval: '' });
        
        if (json.length < 2) return 0;
        
        const headers = json[0].map(h => String(h).trim().toLowerCase());
        let score = 0;
        
        // CRMEB特征
        if (headers.some(h => h.includes('store_name') || h.includes('商品名称'))) score += 0.3;
        if (headers.some(h => h.includes('ot_price') || h.includes('原价'))) score += 0.2;
        if (headers.some(h => h.includes('slider_image') || h.includes('轮播'))) score += 0.2;
        if (headers.some(h => h.includes('cate_id') || h.includes('分类'))) score += 0.15;
        if (headers.some(h => h.includes('stock') || h.includes('库存'))) score += 0.15;
        
        return Math.min(score, 1);
      } catch (e) {
        return 0;
      }
    }
    
    return 0;
  }

  /**
   * 转换xlsx到LiteMall格式
   */
  async convert(input) {
    if (!['xlsx', 'xls'].includes(input.type)) {
      throw new Error('仅支持xlsx/xls格式');
    }
    
    let workbook;
    try {
      const dataType = this._getInputType(input.content);
      workbook = XLSX.read(input.content, { type: dataType });
    } catch (e) {
      throw new Error('Excel文件解析失败: ' + e.message);
    }
    
    const sheetName = workbook.SheetNames[0];
    const sheet = workbook.Sheets[sheetName];
    const rows = XLSX.utils.sheet_to_json(sheet, { defval: '', header: 1 });
    
    if (rows.length < 2) {
      throw new Error('Excel至少需要2行（标题+数据）');
    }
    
    const headers = rows[0].map(h => String(h).trim());
    const now = new Date().toISOString();
    const products = [];
    
    // 字段匹配
    const colMapping = this._mapColumns(headers);
    
    // 解析数据行
    for (let i = 1; i < rows.length; i++) {
      const row = rows[i];
      if (!row || row.length === 0) continue;
      
      // 检查是否空行
      const hasValue = row.some(cell => cell !== '' && cell !== null && cell !== undefined);
      if (!hasValue) continue;
      
      const product = {
        status: 1, unit: '件', stock: 0, price: 0,
        created_at: now, updated_at: now,
      };
      
      for (const [colIdx, field] of Object.entries(colMapping)) {
        const value = row[parseInt(colIdx)];
        if (value === '' || value === null || value === undefined) continue;
        
        if (typeof field === 'string') {
          product[field] = String(value);
        } else if (field.transform) {
          product[field.target] = field.transform(value);
        } else {
          product[field.target] = String(value);
        }
      }
      
      // 处理图片集：统一存储为JSON数组格式
      if (product.images) {
        const parts = String(product.images).split(/[,|;\n]/).filter(Boolean);
        if (!product.image) product.image = parts[0] || '';
        product.images = JSON.stringify(parts);
      }
      // 单图也保证是JSON数组格式
      if (product.image && !product.images) {
        product.images = JSON.stringify([product.image]);
      }
      
      // 必须有名称才视为有效
      if (product.name) {
        products.push(product);
      }
    }
    
    // 生成productImages（详情图独立表）
    const productImages = [];
    for (const p of products) {
      let imgList = [];
      if (p.images) {
        try { imgList = JSON.parse(p.images); } catch(e) { imgList = String(p.images).split(','); }
      }
      imgList.forEach((url, idx) => {
        if (idx > 0 && url) {
          productImages.push({ product_id: p.id, url: url.trim(), type: 0, sort: idx });
        }
      });
      if (imgList.length === 1 && p.image && p.image !== imgList[0]) {
        productImages.push({ product_id: p.id, url: p.image.trim(), type: 0, sort: 0 });
      }
    }

    return {
      manifest: {
        migrationVersion: '1.0.0',
        exportId: `crmeB_xlsx_import_${Date.now()}`,
        exportedAt: now,
        source: 'CRMEB Excel',
        adapter: 'crmeB-xlsx-v1.0',
        stats: { products: products.length, categories: 0, users: 0, productImages: productImages.length },
      },
      data: { products, categories: [], users: [], productSkus: [], productImages },
    };
  }

  /**
   * 自动匹配Excel列名到字段
   */
  _mapColumns(headers) {
    const mapping = {};
    
    for (let i = 0; i < headers.length; i++) {
      const header = headers[i].toLowerCase().trim();
      
      for (const field of this.fieldMap) {
        const matched = field.patterns.some(pattern => 
          header === pattern.toLowerCase() || 
          header.includes(pattern.toLowerCase())
        );
        if (matched) {
          mapping[i] = field;
          break;
        }
      }
    }
    
    // 如果没匹配到名称列，尝试自动检测
    if (!Object.values(mapping).some(f => f.target === 'name')) {
      // 取第一列非数字的作为名称
      const nameField = { target: 'name' };
      // 找第一列（通常是名称）
      if (mapping[0] === undefined) {
        mapping[0] = nameField;
      }
    }
    
    return mapping;
  }

  /**
   * 判断输入类型（base64或binary）
   */
  _getInputType(content) {
    if (typeof content === 'string') {
      // 检查是否是base64编码
      if (content.match(/^([A-Za-z0-9+/=]+)$/)) {
        return 'base64';
      }
      return 'binary';
    }
    if (content instanceof ArrayBuffer) return 'arraybuffer';
    if (Buffer.isBuffer(content)) return 'buffer';
    return 'binary';
  }

  getHelp() {
    return `
<h4>从CRMEB导出Excel</h4>
<ol>
  <li>登录CRMEB后台 → 商品 → 商品管理</li>
  <li>点击"导出"按钮 → 下载Excel文件</li>
  <li>在本页上传 .xlsx 文件即可</li>
</ol>
<p><b>支持的列名（自动识别）：</b></p>
<ul>
  <li>商品名称 / store_name / 产品名称</li>
  <li>价格 / price / 售价</li>
  <li>原价 / ot_price / 市场价</li>
  <li>库存 / stock / 数量</li>
  <li>图片 / image / 主图</li>
  <li>轮播图 / slider_image / 图集</li>
  <li>销量 / sales / 已售</li>
  <li>描述 / description / 详情</li>
  <li>状态 / status / 上架</li>
</ul>
    `.trim();
  }

  getFieldMap() { return this.fieldMap; }
}

module.exports = CrmeBXlsxAdapter;
