import { Message } from 'element-ui'
import { getPayResponse } from '@/utils'
import store from '@/store'
import NP from 'number-precision'
const log = require('electron-log')
const Store = require('electron-store')
const localStore = new Store()
// const { ipcRenderer } = require('electron')
/**
 * 调起中行支付软件
 * @param {*} type 交易类型 为 C，表示是正数（消费交易）；为 R，表示是负数（退货交易） ；
 * @param {*} params 订单信息
 * @param {*} handleCallback 支付回调
 */
export default async function (type, params, vue) {
  let termId, salerId, payType, total

  if (params.memberTrade) {
    total = NP.times(params.memberTrade.total_money, 100) + ''
    switch (params.memberTrade.payChannel) {
      case '中行银行卡支付':
        payType = '001'
        break
      case '中行扫码支付':
        payType = '005'
        break
    }
  } else {
    total = NP.times(params.price, 100) + ''
    switch (params.payChannel) {
      case '中行银行卡支付':
        payType = '001'
        break
      case '中行扫码支付':
        payType = '005'
        break
      default:
        payType = '001'
    }
  }

  // 调起支付

  // // 支付回调
  // ipcRenderer.on('payResult', (event, data) => {
  //   handleCallback && handleCallback(data, params)
  //   ipcRenderer.removeAllListeners('payResult')
  // })

  return new Promise((resolve, reject) => {
    if (localStore.get('mock')) {
      setTimeout(() => {
        resolve('00621485******8058   C000000000001000491907921687738091      130804630025191046300569111160804145549D_U                                                                0000000000010000000000000804145549000491921687738091      130804                                                     001')
      }, 5000)

      return
    }

    termId = localStore.get('termId')
    salerId = store.state.user.id + ''

    if (!termId) {
      Message.error('请到配置页设置款台号')
      reject(new Error('请到配置页设置款台号'))
      return
    }

    let originalInfo = params.bocTradeNo ? getPayResponse(params.bocTradeNo) : ''

    let payParam = {
      termId: termId || '', // 柜台号     10位
      salerId: salerId || '', // 操作员号  10位
      // 为 C，表示是正数（消费交易）；
      // 为 I，表示是正数（查询余额交易）；
      // 为 D，表示是负数（取消交易） ；
      // 为 R，表示是负数（退货交易） ；
      // 为 0[零]，表示（结帐、交易一览和重打票据）
      tradeType: type, // 交易类   1位
      total: total, // 以分为单位，不足左补‘0’   12位
      // 001 选择用卡 (记账类型:银行卡)
      // 002 选择银联二维码扫码 (记账类型:银行卡)
      // 003 选择支付宝扫码 (记账类型:支付宝)
      // 004 选择微信扫码 (记账类型:微信)
      // 005 聚合支付
      payType: payType, // 3位
      codeInfo: '', // 32位  支付方式为 002 银联二维码/003 支付宝/004 微信时传入手机客户端的支付条码信息， 其他交易空格补全
      originalInfo: originalInfo // 96位   撤消或退货交易，上送此域， 其他交易空格补全
    }
    console.log('支付参数', payParam, originalInfo.length)

    const { fork } = require('child_process')
    const path = require('path')

    let child = fork(path.join(__static, 'pos', 'index.js'))

    // 支付进程传回页面实例，便于退出
    vue.posProcess.push(child)
    log.info(`Pos输入：${JSON.stringify(payParam)}`)
    child.send(localStore.path + '=' + JSON.stringify(payParam))
    console.log(localStore.path + '=' + JSON.stringify(payParam))
    child.on('message', msg => {
      console.log('收到子进程消息', msg)
      if (msg === 0) {
        Message.error(`未找到中行支付程序，查找路径为${localStore.get('softposPath')}`)
        resolve()
        return
      }

      let rescode = getPayResponse(msg, 'rescode', true)
      log.info(`Pos输出：${msg}`)

      if (rescode !== '00') {
        Message.error('支付失败')
        resolve()
      } else {
        resolve(msg)
      }
    })

    child.on('exit', () => {
      console.log('子进程退出')
    })

    child.on('uncaughtException', function (err) {
      console.log('捕获到一个未被处理的错误:', err)
      reject(err)
    })
  })
}
