/**
 * 官网独立支付模块 — 数据与轻商城完全隔离
 * ============================================
 * 使用独立数据库 pay.db，不共享轻商城任何数据。
 *
 * 数据库表：
 *   pay_products   — 官网售卖产品
 *   pay_orders     — 订单
 *   pay_payments   — 支付记录
 *
 * 支付流程：
 *   POST /api/pay/checkout    → 下单+支付（一步完成）
 *   GET  /api/pay/order/:no   → 查询订单状态（轮询）
 *   POST /api/pay/notify       → 微信支付异步回调
 *   GET  /api/pay/qrcode       → 二维码生成
 */
const express = require('express');
const path = require('path');
const Database = require('better-sqlite3');
const paymentSdk = require('../lib/payment');
const QRCode = require('qrcode');

const router = express.Router();
const { success, fail } = require('../utils/response');

// ===== 独立数据库连接（pay.db — 和轻商城完全隔离） =====
const DB_PATH = path.join(__dirname, '..', '..', 'data', 'pay.db');
const db = new Database(DB_PATH);
db.pragma('journal_mode = WAL');
db.pragma('foreign_keys = ON');

// ===== 建表 =====
db.exec(`
  CREATE TABLE IF NOT EXISTS pay_products (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL,
    price       REAL    NOT NULL,
    subtitle    TEXT    DEFAULT '',
    features    TEXT    DEFAULT '',
    badge       TEXT    DEFAULT '',
    download    TEXT    DEFAULT '',
    sort        INTEGER DEFAULT 0,
    created_at  DATETIME DEFAULT (datetime('now','localtime'))
  );

  CREATE TABLE IF NOT EXISTS pay_orders (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    order_no    TEXT    NOT NULL UNIQUE,
    product_id  INTEGER NOT NULL,
    product_name TEXT   NOT NULL,
    amount      REAL    NOT NULL,
    email       TEXT    DEFAULT '',
    status      TEXT    DEFAULT 'pending_pay',
    paid_at     DATETIME,
    download_at DATETIME,
    created_at  DATETIME DEFAULT (datetime('now','localtime')),
    updated_at  DATETIME DEFAULT (datetime('now','localtime'))
  );

  CREATE TABLE IF NOT EXISTS pay_payments (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    trade_no        TEXT    NOT NULL UNIQUE,
    order_id        INTEGER NOT NULL,
    amount          REAL    NOT NULL,
    method          TEXT    DEFAULT 'wechat',
    status          TEXT    DEFAULT 'pending',
    transaction_id  TEXT    DEFAULT '',
    pay_time        DATETIME,
    raw_data        TEXT    DEFAULT '',
    created_at      DATETIME DEFAULT (datetime('now','localtime'))
  );

  CREATE INDEX IF NOT EXISTS idx_orders_no ON pay_orders(order_no);
  CREATE INDEX IF NOT EXISTS idx_orders_status ON pay_orders(status);
  CREATE INDEX IF NOT EXISTS idx_payments_trade ON pay_payments(trade_no);
`);

// ===== 种子数据：官网卖的4个产品 =====
const count = db.prepare('SELECT COUNT(*) as c FROM pay_products').get().c;
if (count === 0) {
  const insert = db.prepare(`INSERT INTO pay_products(name,price,subtitle,features,badge,download,sort) VALUES(?,?,?,?,?,?,?)`);
  db.transaction(() => {
    insert.run('轻商城标准版', 199, '永久授权 · 保留版权 · 域名绑定',
      '三级分销 / AI运营助手|PC前台 / 微信小程序|秒杀 / 拼团 / 优惠券|页面装修 / 商品采集|高级统计 / 积分商城|底部显示 Powered By LiteMall',
      '推荐', '/download/lite-standard.tar.gz', 1);
    insert.run('轻商城去版权版', 599, '永久授权 · 去除版权 · 域名绑定',
      '标准版全部功能|自定义底部版权文字|去除所有品牌水印|可贴牌交付客户',
      '', '/download/lite-pro.tar.gz', 2);
    insert.run('供应链基础版', 599, '商户工作台·永久授权·保留版权',
      '商城前端完整功能|基础进销存管理|基础数据报表|PC管理后台+H5商城|快递查询/短信通知|保留版权',
      '', '/download/supply-base.tar.gz', 3);
    insert.run('供应链旗舰版', 999, '全功能·去版权·永久授权',
      '基础版全部功能|完整多仓进销存一体化|高级分销/拼团/秒杀|全套终端H5+小程序源码|财务配套/自定义打印|2域名授权/远程部署',
      '🔥 热销', '/download/supply-pro.tar.gz', 4);
  })();
  console.log('[独立支付] 已初始化4个产品种子数据');
}

// ===== 工具函数 =====
function genOrderNo() {
  const n = new Date();
  return `GW${n.getFullYear()}${String(n.getMonth()+1).padStart(2,'0')}${String(n.getDate()).padStart(2,'0')}${String(n.getHours()).padStart(2,'0')}${String(n.getMinutes()).padStart(2,'0')}${String(n.getSeconds()).padStart(2,'0')}${String(Math.floor(Math.random()*100000)).padStart(5,'0')}`;
}
function genTradeNo() {
  const n = new Date();
  return `PY${n.getFullYear()}${String(n.getMonth()+1).padStart(2,'0')}${String(n.getDate()).padStart(2,'0')}${String(n.getHours()).padStart(2,'0')}${String(n.getMinutes()).padStart(2,'0')}${String(n.getSeconds()).padStart(2,'0')}${String(Math.floor(Math.random()*100000)).padStart(5,'0')}`;
}

// ===== 微信支付（独立） =====
function getWechatConfig() {
  // 从轻商城的 system_config 表读取微信支付配置（只用这个，不共享用户/订单数据）
  try {
    const sysDb = new Database(path.join(__dirname, '..', '..', 'data', 'litemall.db'));
    const get = (key) => {
      const r = sysDb.prepare("SELECT value FROM system_config WHERE key=?").get(key);
      return r ? r.value : '';
    };
    const cfg = {
      appid: get('wechat_appid'),
      mchId: get('wechat_mchid'),
      apiKey: get('wechat_key'),
      appSecret: get('wechat_appsecret'),
      notifyUrl: get('wechat_notify_url') || 'https://ssypco.com/api/pay/notify'
    };
    sysDb.close();
    return cfg;
  } catch(e) {
    console.error('[独立支付] 读取微信配置失败:', e.message);
    return { appid: '', mchId: '', apiKey: '', appSecret: '', notifyUrl: 'https://ssypco.com/api/pay/notify' };
  }
}

function wechatConfigured() {
  const cfg = getWechatConfig();
  return !!(cfg.appid && cfg.mchId && cfg.apiKey);
}

async function createWechatNativePay(tradeNo, amount, description) {
  const cfg = getWechatConfig();
  const utils = require('../lib/payment/utils');

  const params = {
    appid: cfg.appid,
    mch_id: cfg.mchId,
    nonce_str: utils.randomStr(),
    body: description || '省胜优铺-商品购买',
    out_trade_no: tradeNo,
    total_fee: utils.amountToFen(amount),
    spbill_create_ip: '127.0.0.1',
    notify_url: cfg.notifyUrl,
    trade_type: 'NATIVE',
    product_id: tradeNo
  };
  params.sign = utils.wechatSign(params, cfg.apiKey);

  const xml = utils.buildXml('xml', params);
  const resp = await utils.httpsPost('https://api.mch.weixin.qq.com/pay/unifiedorder', xml, 'text/xml');

  if (resp.status !== 200) throw new Error('微信支付请求失败: HTTP ' + resp.status);

  // 手动解析微信XML（utils.parseXml有bug，返回空对象）
  const result = parseWechatXml(resp.data);
  if (!result || result.return_code !== 'SUCCESS') throw new Error('微信支付错误: ' + ((result && result.return_msg) || '返回失败'));
  if (result.result_code !== 'SUCCESS') throw new Error('微信支付错误: ' + (result.err_code_des || result.err_code));

  return {
    prepayId: result.prepay_id || '',
    codeUrl: result.code_url || '',
    tradeType: 'NATIVE'
  };
}

// 简单微信XML解析器（utils.parseXml有bug，这里重写）
function parseWechatXml(xmlStr) {
  if (!xmlStr) return {};
  const result = {};
  const regex = /<(\w+)>(?:<!\[CDATA\[)?([^\]<>]+)(?:\]\]>)?<\/\1>/g;
  let match;
  while ((match = regex.exec(xmlStr)) !== null) {
    result[match[1]] = match[2].trim();
  }
  // 对于有换行的CDATA也支持
  const regex2 = /<(\w+)>\s*<!\[CDATA\[([\s\S]*?)\]\]>\s*<\/\1>/g;
  while ((match = regex2.exec(xmlStr)) !== null) {
    result[match[1]] = match[2].trim();
  }
  return result;
}

// ===== 支付宝支付（独立） =====
function getAlipayConfig() {
  try {
    const sysDb = new Database(path.join(__dirname, '..', '..', 'data', 'litemall.db'));
    const get = (key) => {
      const r = sysDb.prepare("SELECT value FROM system_config WHERE key=?").get(key);
      return r ? r.value : '';
    };
    const cfg = {
      appId: get('alipay_appid'),
      privateKey: get('alipay_private_key'),
      alipayPublicKey: get('alipay_public_key'),
      notifyUrl: get('alipay_notify_url') || 'https://ssypco.com/api/pay/alipay-notify',
      gateway: 'https://openapi.alipay.com/gateway.do'
    };
    sysDb.close();
    return cfg;
  } catch(e) {
    console.error('[独立支付] 读取支付宝配置失败:', e.message);
    return { appId: '', privateKey: '', alipayPublicKey: '', notifyUrl: 'https://ssypco.com/api/pay/alipay-notify' };
  }
}

function alipayConfigured() {
  const cfg = getAlipayConfig();
  return !!(cfg.appId && cfg.privateKey && cfg.alipayPublicKey);
}

function createAlipayPagePay(tradeNo, amount, subject) {
  const cfg = getAlipayConfig();
  const crypto = require('crypto');

  const bizContent = JSON.stringify({
    out_trade_no: tradeNo,
    product_code: 'FAST_INSTANT_TRADE_PAY',
    total_amount: parseFloat(amount).toFixed(2),
    subject: subject || '省胜优铺-商品购买'
  });

  // 请求参数
  const params = {
    app_id: cfg.appId,
    method: 'alipay.trade.page.pay',
    format: 'JSON',
    charset: 'utf-8',
    sign_type: 'RSA2',
    timestamp: new Date().toISOString().replace(/T/, ' ').replace(/\..*/, ''),
    version: '1.0',
    notify_url: cfg.notifyUrl,
    return_url: 'https://ssypco.com/',
    biz_content: bizContent
  };

  // 格式化私钥
  function formatPrivateKey(raw) {
    if (raw.includes('BEGIN')) return raw;
    return '-----BEGIN PRIVATE KEY-----\n' + raw.match(/.{1,64}/g).join('\n') + '\n-----END PRIVATE KEY-----';
  }

  // RSA-SHA256签名
  const signStr = Object.keys(params).sort().map(k => k + '=' + params[k]).join('&');
  const signer = crypto.createSign('RSA-SHA256');
  signer.update(signStr, 'utf8');
  const sign = signer.sign(formatPrivateKey(cfg.privateKey), 'base64');
  params.sign = sign;

  // 生成支付链接（电脑网站支付：直接拼参数成URL，不用调API）
  const query = Object.keys(params).sort().map(k => k + '=' + encodeURIComponent(params[k])).join('&');
  const payUrl = cfg.gateway + '?' + query;

  return { payUrl: payUrl };
}

// ===================================================================
// 1. 下单+支付（免登录）
// POST /api/pay/checkout
// Body: { product_id: number, email?: string, method?: 'wechat'|'alipay' }
// ===================================================================
router.post('/checkout', async (req, res) => {
  try {
    const { product_id, email, method } = req.body;
    const payMethod = method === 'alipay' ? 'alipay' : 'wechat';

    // 查产品
    const product = db.prepare('SELECT * FROM pay_products WHERE id=?').get(product_id);
    if (!product) return res.json(fail('商品不存在'));

    // 校验邮箱
    if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
      return res.json(fail('邮箱格式不正确'));
    }

    // 创建订单
    const orderNo = genOrderNo();
    db.prepare(`INSERT INTO pay_orders(order_no, product_id, product_name, amount, email, status)
      VALUES(?,?,?,?,?,'pending_pay')`).run(orderNo, product_id, product.name, product.price, email || '');

    // 创建支付记录
    const tradeNo = genTradeNo();
    const order = db.prepare('SELECT id FROM pay_orders WHERE order_no=?').get(orderNo);
    db.prepare(`INSERT INTO pay_payments(trade_no, order_id, amount, method, status)
      VALUES(?,?,?,?,'pending')`).run(tradeNo, order.id, product.price, payMethod);

    // 调支付
    let payResult;
    // [安全] 是否模拟完全由系统配置 payment_test_mode 决定（生产模式绝不产生模拟支付）
    const isMock = paymentSdk.isSimulateMode();

    if (isMock) {
      payResult = {
        mode: 'simulate',
        codeUrl: null,
        payUrl: `/api/pay/mock-pay?trade_no=${tradeNo}&order_no=${orderNo}`
      };
    } else if (payMethod === 'alipay') {
      try {
        const aliResult = createAlipayPagePay(tradeNo, product.price, product.name);
        payResult = { mode: 'production', codeUrl: aliResult.payUrl, payUrl: null, method: 'alipay' };
      } catch (aliErr) {
        // [安全] 生产模式严禁模拟回退，避免资金被伪造支付
        console.error('[独立支付] 支付宝生产调用失败:', aliErr.message);
        return res.json(fail('支付发起失败，请稍后重试'));
      }
    } else {
      try {
        const wxResult = await createWechatNativePay(tradeNo, product.price, product.name);
        payResult = { mode: 'production', codeUrl: wxResult.codeUrl, payUrl: null, method: 'wechat' };
      } catch (wxErr) {
        // [安全] 生产模式严禁模拟回退，避免资金被伪造支付
        console.error('[独立支付] 微信支付生产调用失败:', wxErr.message);
        return res.json(fail('支付发起失败，请稍后重试'));
      }
    }

    return res.json(success({
      order_no: orderNo,
      trade_no: tradeNo,
      amount: product.price,
      product_name: product.name,
      mode: payResult.mode,
      method: payMethod,
      is_mock: isMock,
      code_url: payResult.codeUrl,
      pay_url: payResult.payUrl
    }, '下单成功'));

  } catch (e) {
    console.error('[独立支付] checkout异常:', e);
    return res.json(fail('系统异常: ' + e.message));
  }
});

// ===================================================================
// 2. 查询订单状态
// GET /api/pay/order/:orderNo
// ===================================================================
router.get('/order/:orderNo', (req, res) => {
  try {
    const order = db.prepare(`
      SELECT o.*, p.download FROM pay_orders o
      LEFT JOIN pay_products p ON p.id = o.product_id
      WHERE o.order_no=?
    `).get(req.params.orderNo);

    if (!order) return res.json(fail('订单不存在'));

    const isPaid = (order.status === 'paid' || order.status === 'downloaded');
    return res.json(success({
      order_no: order.order_no,
      status: order.status,
      amount: order.amount,
      product_name: order.product_name,
      email: order.email,
      download_url: isPaid ? order.download : null,
      created_at: order.created_at,
      paid_at: order.paid_at
    }));
  } catch (e) {
    return res.json(fail('查询失败: ' + e.message));
  }
});

// ===================================================================
// 3. 微信支付异步回调
// POST /api/pay/notify
// ===================================================================
router.post('/notify', (req, res) => {
  try {
    const rawBody = req.rawBody || (typeof req.body === 'object' ? '' : req.body) || '';
    const bodyStr = rawBody;

    // 调试日志
    console.log('[独立支付-回调] rawBody:', (rawBody || '').substring(0, 200));
    console.log('[独立支付-回调] req.body:', JSON.stringify(req.body || {}).substring(0, 200));

    // 解析微信XML回调（使用自定义解析器，utils.parseXml有bug）
    const result = parseWechatXml(bodyStr);
    console.log('[独立支付-回调] 解析结果:', JSON.stringify(result));

    if (!result || result.return_code !== 'SUCCESS' || result.result_code !== 'SUCCESS') {
      console.error('[独立支付] 回调失败:', (result && (result.return_msg || result.err_code_des)) || '返回失败');
      return res.type('text/xml').send('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[FAIL]]></return_msg></xml>');
    }

    const tradeNo = result.out_trade_no;
    const transactionId = result.transaction_id;
    const totalFee = parseFloat(result.total_fee) / 100;

    // 查支付记录
    const pay = db.prepare('SELECT * FROM pay_payments WHERE trade_no=?').get(tradeNo);
    if (!pay) {
      console.error('[独立支付] 回调: 支付记录不存在', tradeNo);
      return res.type('text/xml').send('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[NOT_FOUND]]></return_msg></xml>');
    }
    if (pay.status === 'success') {
      return res.type('text/xml').send('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
    }

    // 更新支付记录 + 订单
    const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
    db.prepare(`UPDATE pay_payments SET status='success', transaction_id=?, pay_time=?, raw_data=? WHERE trade_no=?`)
      .run(transactionId || '', now, bodyStr.slice(0, 1000), tradeNo);
    db.prepare(`UPDATE pay_orders SET status='paid', paid_at=?, updated_at=? WHERE id=?`)
      .run(now, now, pay.order_id);

    console.log(`[独立支付] ${tradeNo} 支付成功, 金额: ¥${totalFee}`);
    return res.type('text/xml').send('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');

  } catch (e) {
    console.error('[独立支付] 回调异常:', e);
    return res.type('text/xml').send('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[ERROR]]></return_msg></xml>');
  }
});

// ===================================================================
// 4. 二维码生成
// GET /api/pay/qrcode?text=...
// ===================================================================
router.get('/qrcode', async (req, res) => {
  try {
    const text = req.query.text || '';
    if (!text) return res.status(400).type('text/plain').send('text required');
    const qrBuf = await QRCode.toBuffer(text, {
      type: 'png', width: 400, margin: 2,
      color: { dark: '#1a1a2e', light: '#ffffff' }
    });
    res.type('image/png').send(qrBuf);
  } catch (e) {
    res.status(500).type('text/plain').send('QR error');
  }
});

// ===================================================================
// 5. 确认下载（标记订单已完成）
// POST /api/pay/confirm/:orderNo
// ===================================================================
router.post('/confirm/:orderNo', (req, res) => {
  try {
    const order = db.prepare('SELECT id, status FROM pay_orders WHERE order_no=?').get(req.params.orderNo);
    if (!order) return res.json(fail('订单不存在'));
    if (order.status !== 'paid') return res.json(fail('订单未支付或已下载'));

    const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
    db.prepare(`UPDATE pay_orders SET status='downloaded', download_at=?, updated_at=? WHERE id=?`)
      .run(now, now, order.id);

    return res.json(success(null, '下载确认成功'));
  } catch (e) {
    return res.json(fail('确认失败: ' + e.message));
  }
});

// ===================================================================
// 6. 模拟支付页面（测试用，免登录）
// GET /api/pay/mock-pay?trade_no=xxx&order_no=xxx
// ===================================================================
router.get('/mock-pay', (req, res) => {
  // [安全] 仅在系统配置为模拟支付模式时允许模拟支付（防止伪造支付成功）
  if (!paymentSdk.isSimulateMode()) return res.status(403).send('模拟支付已禁用');
  const { trade_no, order_no } = req.query;
  if (!trade_no || !order_no) return res.send('参数缺失');

  // 模拟支付成功，更新状态
  try {
    const pay = db.prepare('SELECT * FROM pay_payments WHERE trade_no=?').get(trade_no);
    if (pay && pay.status === 'pending') {
      const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
      db.prepare(`UPDATE pay_payments SET status='success', transaction_id='MOCK_'+?, pay_time=? WHERE trade_no=?`)
        .run(trade_no, now, trade_no);
      db.prepare(`UPDATE pay_orders SET status='paid', paid_at=?, updated_at=? WHERE id=?`)
        .run(now, now, pay.order_id);
      console.log(`[独立支付-模拟] ${trade_no} 支付成功`);
    }
  } catch(e) { /* ignore */ }

  res.send(`
    <html><head><meta charset="utf-8"><title>模拟支付成功</title>
    <style>body{font-family:sans-serif;text-align:center;padding:80px 20px}
    .success{color:#10b981;font-size:48px;margin-bottom:16px}
    .btn{display:inline-block;padding:14px 36px;background:#10b981;color:#fff;text-decoration:none;border-radius:10px;font-size:16px;margin-top:20px}</style></head>
    <body>
    <div class="success">✅</div>
    <h2>模拟支付成功</h2>
    <p style="color:#666;margin:12px 0">订单: ${order_no}</p>
    <p style="color:#666">请关闭此页面，回到官网查看下载</p>
    <a href="https://ssypco.com/" class="btn">返回官网</a>
    </body></html>
  `);
});

// ===================================================================
// 7. 获取产品列表（给官网用）
// GET /api/pay/products
// ===================================================================
router.get('/products', (req, res) => {
  try {
    const products = db.prepare('SELECT id, name, price, subtitle, features, badge, sort FROM pay_products ORDER BY sort').all();
    return res.json(success(products));
  } catch (e) {
    return res.json(fail('获取失败'));
  }
});

// ===================================================================
// 8. 支付宝异步回调
// POST /api/pay/alipay-notify
// ===================================================================
router.post('/alipay-notify', (req, res) => {
  try {
    const params = req.body || {};
    console.log('[独立支付-支付宝回调] 收到通知参数:', Object.keys(params).join(','));

    // 支付宝通知参数包含：trade_status, out_trade_no, trade_no, total_amount, sign 等
    const outTradeNo = params.out_trade_no;
    const tradeStatus = params.trade_status;

    if (!outTradeNo || tradeStatus !== 'TRADE_SUCCESS') {
      return res.send('success'); // 支付宝要求必须返回success
    }

    // 查支付记录
    const pay = db.prepare('SELECT * FROM pay_payments WHERE trade_no=?').get(outTradeNo);
    if (!pay) {
      console.error('[独立支付-支付宝回调] 支付记录不存在:', outTradeNo);
      return res.send('success');
    }
    if (pay.status === 'success') {
      return res.send('success');
    }

    // 更新支付记录 + 订单
    const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
    const transactionId = params.trade_no || '';
    db.prepare(`UPDATE pay_payments SET status='success', transaction_id=?, pay_time=?, raw_data=? WHERE trade_no=?`)
      .run(transactionId, now, JSON.stringify(params).slice(0, 1000), outTradeNo);
    db.prepare(`UPDATE pay_orders SET status='paid', paid_at=?, updated_at=? WHERE id=?`)
      .run(now, now, pay.order_id);

    console.log(`[独立支付-支付宝] ${outTradeNo} 支付成功`);
    return res.send('success');

  } catch (e) {
    console.error('[独立支付-支付宝回调] 异常:', e);
    return res.send('success');
  }
});

module.exports = router;
