/**
 * 淘宝/天猫 适配器
 * 
 * 支持从淘宝助理导出的CSV数据/千牛数据迁移到LiteMall
 * 
 * 导入方式:
 *   1. 淘宝助理 → 导出CSV → 上传导入
 *   2. 千牛卖家中心 → 下载商品数据 → CSV格式
 *   3. JSON格式（其他工具导出的标准化数据）
 */

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

class TaobaoAdapter extends PlatformAdapter {
  constructor() {
    super({
      name: 'taobao',
      label: '淘宝/天猫',
      version: '1.0',
      description: '从淘宝/天猫店铺导入商品数据（支持淘宝助理CSV导出格式）',
      icon: '🍑',
      formats: ['csv', 'json'],
    });
    
    // 淘宝CSV字段 → LiteMall字段映射
    this.csvFieldMap = {
      // 标准淘宝助理CSV字段
      '宝贝名称': 'name',
      '商品名称': 'name',
      'title': 'name',
      'goods_name': 'name',
      
      '宝贝价格': { target: 'price', transform: v => parseFloat(v) || 0 },
      '商品价格': { target: 'price', transform: v => parseFloat(v) || 0 },
      'price': { target: 'price', transform: v => parseFloat(v) || 0 },
      'sell_price': { target: 'price', transform: v => parseFloat(v) || 0 },
      
      '原价': { target: 'original_price', transform: v => parseFloat(v) || 0 },
      '原价格': { target: 'original_price', transform: v => parseFloat(v) || 0 },
      'ot_price': { target: 'original_price', transform: v => parseFloat(v) || 0 },
      'original_price': { target: 'original_price', transform: v => parseFloat(v) || 0 },
      
      '库存': { target: 'stock', transform: v => parseInt(v) || 0 },
      '数量': { target: 'stock', transform: v => parseInt(v) || 0 },
      'stock': { target: 'stock', transform: v => parseInt(v) || 0 },
      'num': { target: 'stock', transform: v => parseInt(v) || 0 },
      
      '销量': { target: 'sales', transform: v => parseInt(v) || 0 },
      'sold_quantity': { target: 'sales', transform: v => parseInt(v) || 0 },
      'sales': { target: 'sales', transform: v => parseInt(v) || 0 },
      
      '图片地址': { target: 'image', transform: v => (v || '').split('|')[0] || (v || '').split(',')[0] },
      '图片链接': { target: 'image', transform: v => (v || '').split('|')[0] || (v || '').split(',')[0] },
      '图片': { target: 'image', transform: v => (v || '').split('|')[0] || (v || '').split(',')[0] },
      '主图': { target: 'image', transform: v => (v || '').split('|')[0] || (v || '').split(',')[0] },
      'image': { target: 'image', transform: v => (v || '').split('|')[0] || (v || '').split(',')[0] },
      
      '图片集': { target: 'images', transform: v => (v || '').replace(/\|/g, ',').replace(/https:/g, 'https:') },
      '商品图片': { target: 'images', transform: v => (v || '').replace(/\|/g, ',') },
      'images': { target: 'images', transform: v => typeof v === 'string' ? v.replace(/\|/g, ',') : '' },
      
      '宝贝类目': 'category_id',
      '类目ID': 'category_id',
      'category_id': 'category_id',
      
      '商品描述': 'description',
      '详情': 'description', 
      'description': 'description',
      
      '单位': 'unit',
      'unit': 'unit',
      
      '商品ID': 'id',
      '宝贝ID': 'id',
      'num_iid': 'id',
      
      // SKU相关
      '规格1': null,
      '规格2': null,
      'sku_specs': null,
    };
  }

  detect(input) {
    const content = input.content || '';
    if (!content) return 0;
    let score = 0;
    
    if (input.type === 'csv') {
      const firstLine = content.split('\n')[0] || '';
      // 淘宝CSV特征字段
      const tbSignals = ['宝贝名称', '商品名称', '宝贝价格', '商品价格', '图片地址', 
                         'num_iid', 'sell_price', '宝贝类目'];
      for (const sig of tbSignals) {
        if (firstLine.includes(sig)) {
          score += 0.15;
        }
      }
      // 淘宝助理CSV通常以BOM开头或包含\t分隔
      if (content.includes('\t') && (content.includes('宝贝名称') || content.includes('num_iid'))) {
        score += 0.2;
      }
    }
    
    if (input.type === 'json') {
      try {
        const data = JSON.parse(content);
        if (data.source === 'taobao' || data.source === '淘宝') score = 1;
        if (Array.isArray(data) && data[0]?.num_iid) score += 0.3;
        if (Array.isArray(data) && data[0]?.sell_price) score += 0.2;
      } catch (e) { /* ignore */ }
    }
    
    return Math.min(score, 1);
  }

  async convert(input) {
    if (input.type === 'csv') return this._convertFromCsv(input.content);
    if (input.type === 'json') return this._convertFromJson(input.content);
    throw new Error('不支持的格式: ' + input.type + '，仅支持csv和json');
  }

  _convertFromCsv(csvContent) {
    const products = [];
    const lines = csvContent.split('\n').filter(l => l.trim());
    if (lines.length < 2) throw new Error('CSV数据至少需要标题行+1行数据');
    
    // 检测分隔符（淘宝CSV可能用制表符或逗号）
    const firstLine = lines[0];
    const delimiter = firstLine.includes('\t') ? '\t' : ',';
    
    // 解析标题行
    const headers = this._parseCsvLine(firstLine, delimiter);
    
    // 建立header到field映射
    const fieldIndex = {};
    for (let i = 0; i < headers.length; i++) {
      const h = headers[i].trim();
      if (this.csvFieldMap[h]) {
        fieldIndex[i] = this.csvFieldMap[h];
      }
    }
    
    // 解析数据行
    for (let rowIdx = 1; rowIdx < lines.length; rowIdx++) {
      const values = this._parseCsvLine(lines[rowIdx], delimiter);
      const product = {
        status: 1,
        unit: '件',
        stock: 0,
        price: 0,
        created_at: new Date().toISOString(),
        updated_at: new Date().toISOString(),
      };
      
      let imagesList = [];
      
      for (let i = 0; i < values.length; i++) {
        const mapping = fieldIndex[i];
        if (!mapping) continue;
        
        const value = values[i]?.trim() || '';
        
        if (typeof mapping === 'string') {
          if (mapping) product[mapping] = value;
        } else if (mapping.transform) {
          product[mapping.target] = mapping.transform(value);
        }
      }
      
      // 处理图片集
      if (product.images && !product.image) {
        const parts = product.images.replace(/\|/g, ',').split(',');
        product.image = parts[0] || '';
      }
      
      // 清理空字段
      for (const key of Object.keys(product)) {
        if (product[key] === '' || product[key] === null || product[key] === undefined) {
          if (['name'].includes(key)) continue;
          delete product[key];
        }
      }
      
      if (product.name) {
        products.push(product);
      }
    }
    
    const now = new Date().toISOString();
    return {
      manifest: {
        migrationVersion: '1.0.0',
        exportId: `taobao_import_${Date.now()}`,
        exportedAt: now,
        source: '淘宝/天猫',
        adapter: 'taobao-v1.0',
        stats: { products: products.length, categories: 0, users: 0 },
      },
      data: { products, categories: [], users: [], productSkus: [], productImages: [] },
    };
  }

  _convertFromJson(jsonContent) {
    let source;
    try { source = JSON.parse(jsonContent); } catch (e) { throw new Error('JSON解析失败'); }
    if (source.manifest && source.data) return source;
    
    const products = Array.isArray(source) ? source : (source.products || []);
    const now = new Date().toISOString();
    
    const mapped = products.map(p => ({
      id: p.num_iid || p.id,
      name: p.title || p.name || p.goods_name || '未命名商品',
      price: parseFloat(p.price || p.sell_price || 0),
      original_price: parseFloat(p.ot_price || p.original_price || 0),
      stock: parseInt(p.stock || p.num || 0),
      sales: parseInt(p.sales || p.sold_quantity || 0),
      image: typeof p.image === 'string' ? (p.image.split('|')[0] || p.image.split(',')[0]) : '',
      images: typeof p.images === 'string' ? p.images.replace(/\|/g, ',') : '',
      category_id: p.category_id || p.cid || '',
      description: p.description || p.goods_desc || '',
      status: 1, unit: '件',
      created_at: now, updated_at: now,
    }));
    
    return {
      manifest: {
        migrationVersion: '1.0.0',
        exportId: `taobao_import_${Date.now()}`,
        exportedAt: now, source: '淘宝/天猫', adapter: 'taobao-v1.0',
        stats: { products: mapped.length, categories: 0, users: 0 },
      },
      data: { products: mapped, categories: [], users: [], productSkus: [], productImages: [] },
    };
  }

  _parseCsvLine(line, delimiter) {
    const result = [];
    let current = '';
    let inQuotes = false;
    
    for (let i = 0; i < line.length; i++) {
      const ch = line[i];
      if (inQuotes) {
        if (ch === '"') {
          if (line[i + 1] === '"') { current += '"'; i++; }
          else { inQuotes = false; }
        } else {
          current += ch;
        }
      } else {
        if (ch === '"') { inQuotes = true; }
        else if (ch === delimiter) { result.push(current); current = ''; }
        else { current += ch; }
      }
    }
    result.push(current);
    return result;
  }

  getHelp() {
    return `
<h4>从淘宝/天猫导出数据</h4>

<p><b>方式一：淘宝助理导出（推荐）</b></p>
<ol>
  <li>打开淘宝助理 → 选中要导出的商品</li>
  <li>点击"导出CSV" → 选择"标准CSV格式"</li>
  <li>下载CSV文件，上传到本页导入即可</li>
</ol>

<p><b>方式二：千牛卖家中心</b></p>
<ol>
  <li>登录千牛卖家中心 → 宝贝管理 → 出售中的宝贝</li>
  <li>点击"导出数据" → 选择导出字段</li>
  <li>下载CSV文件 → 上传导入</li>
</ol>

<p><b>支持导入的字段：</b></p>
<ul>
  <li>✅ 商品名称 / 标题</li>
  <li>✅ 价格 / 原价</li>
  <li>✅ 库存数量</li>
  <li>✅ 主图 / 图片集</li>
  <li>✅ 商品描述</li>
  <li>✅ 销量数据</li>
</ul>

<p><b>注意：</b></p>
<ul>
  <li>淘宝CSV可能使用制表符分隔，系统会自动识别</li>
  <li>图片链接建议保持原链接（淘宝图片通常可在外部访问）</li>
  <li>暂不支持SKU规格导入（开发中）</li>
</ul>
    `.trim();
  }

  getFieldMap() { return this.csvFieldMap; }
}

module.exports = TaobaoAdapter;
