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

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

  // 使用本地数据进行赋值
  if (posConfig) {
    termId = posConfig.termId
    salerId = store.state.user.id + '' || posConfig.salerId
  }

  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)
  // 调起支付
  ipcRenderer.send('showPos', payParam)
  // createProcess(payParam)
  // 支付回调
  ipcRenderer.on('payResult', (event, data) => {
    handleCallback && handleCallback(data, params)
    ipcRenderer.removeAllListeners('payResult')
  })
}

export function createProcess (params) {
  const { fork } = require('child_process')
  const path = require('path')

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

  child.send(JSON.stringify(params))

  child.on('message', msg => {
    console.log('收到子进程消息', msg)
    // win.webContents.send('payResult', msg)
  })

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

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

function getPosConfigData () {
  return new Promise((resolve, reject) => {
    let configFile = require('path').join('C://', 'cticket_pos.json')
    let fs = require('fs')
    fs.open(configFile, 'r', (err, data) => {
      if (err) {
        console.log(err)
        Message.error({
          message: '未找到本地配置文件C://cticket_pos.json',
          type: 'error'
        })
        resolve()

        return
      }
      resolve(JSON.parse(fs.readFileSync(configFile)))
    })
  })
}

/**
 * 获取交易响应结果，不传默认返回96位交易要素
 * @param {*} str 完整信息
 * @param {*} type 单独获取某个属性
 * @param {*} logAll 打印所有信息到控制台
 */
export function getPayResponse (str, type, logAll) {
  const rescode = str.slice(0, 2)
  const cardNo = str.slice(2, 21)
  const tradeType = str.slice(21, 22)
  const total = str.slice(22, 34)
  const tradeNo = str.slice(34, 40)
  const bankNo = str.slice(40, 43)
  const referenceNo = str.slice(43, 55)
  const authCode = str.slice(55, 61)
  const batchNo = str.slice(61, 67)
  const terminalNo = str.slice(67, 75)
  const businessNo = str.slice(75, 90)
  const tradeDate = str.slice(90, 94)
  const tradeTime = str.slice(94, 100)
  const cardSign = str.slice(100, 103)
  const orderNo = str.slice(103, 167)
  const actualTotal = str.slice(167, 179)
  const discountPrice = str.slice(179, 191)
  const tradeElement = str.slice(191, 287)

  const result = {
    rescode,
    cardNo,
    tradeType,
    total,
    tradeNo,
    bankNo,
    referenceNo,
    authCode,
    batchNo,
    terminalNo,
    businessNo,
    tradeDate,
    tradeTime,
    cardSign,
    orderNo,
    actualTotal,
    discountPrice,
    tradeElement
  }

  logAll && console.table(
    [
      { name: '响应码', value: rescode, '长度': rescode.length },
      { name: '卡号', value: cardNo, '长度': cardNo.length },
      { name: '交易类型', value: tradeType, '长度': tradeType.length },
      { name: '总金额', value: total, '长度': total.length },
      { name: '交易流水号', value: tradeNo, '长度': tradeNo.length },
      { name: '发卡行号', value: bankNo, '长度': bankNo.length },
      { name: '参考号', value: referenceNo, '长度': referenceNo.length },
      { name: '授权码', value: authCode, '长度': authCode.length },
      { name: '批次号', value: batchNo, '长度': batchNo.length },
      { name: '终端号', value: terminalNo, '长度': terminalNo.length },
      { name: '商户号', value: businessNo, '长度': businessNo.length },
      { name: '交易日期', value: tradeDate, '长度': tradeDate.length },
      { name: '交易时间', value: tradeTime, '长度': tradeTime.length },
      { name: '借贷记卡标识', value: cardSign, '长度': cardSign.length },
      { name: '渠道订单号', value: orderNo, '长度': orderNo.length },
      { name: '实际金额', value: actualTotal, '长度': actualTotal.length },
      { name: '优惠金额', value: discountPrice, '长度': discountPrice.length },
      { name: '交易要素', value: tradeElement, '长度': tradeElement.length }
    ]
  )

  return type ? result[type] : result['tradeElement']
}

window.showPosDetail = (str) => {
  getPayResponse(str, null, true)
}
