import store from '@/store'
import './string'

const Store = require('electron-store')
const localStore = new Store()
const posName = localStore.get('posName')

/**
 * 获取交易响应结果，不传默认返回96位交易要素
 * @param {*} str 完整信息
 * @param {*} type 单独获取某个属性
 * @param {*} staticScenic 指定景点格式化，一般用于测试
 */
export function getPayResponse (str, type, staticScenic) {
  const scenicName = staticScenic || localStore.get('scenicName') || store.state.user.scenicName

  console.log(scenicName)

  switch (scenicName) {
    case '东方绿舟':
    case '':
      return handleDflz(str, type)
    case '绿博园':
      if (posName === 'nonghang') {
        return handleLby_nh(str, type)
      } else if (posName === 'yinlian') {
        return handleLby_yl(str, type)
      } else {
        return handleLby_jh(str, type)
      }
    case '狼山景区':
    case '军山景区':
    case '天津之眼':
      return handleCommon(str, type)
    case '伏羲山景区':
      return handleFxs(str, type)
    case '西宁景区':
      return handleXining(str, type)
  }
}

window.getPayResponse = getPayResponse

// 通用JSON格式
function handleCommon (str, type) {
  let obj
  try {
    obj = JSON.parse(str)
  } catch (e) {
    return ''
  }
  if (type) {
    return obj[type]
  }
  return obj
}

// 绿博园
function handleLby_nh (str, type) {
  return {
    rescode: str.subCHString(0, 2), // 返回码 2,
    bankNo: str.subCHString(2, 10), // 发卡行 8,
    cardNo: str.subCHString(10, 30), // 卡号 20,
    refNo: str.subCHString(30, 36), // 凭证号 6,
    actualTotal: str.subCHString(36, 48), // 实扣金额 12,
    errorInfo: str.subCHString(48, 88), // 错误说明  40,
    businessNo: str.subCHString(88, 103), // 商户号  15,
    terminalNo: str.subCHString(103, 111), // 终端号  8,
    batchNo: str.subCHString(111, 117), // 批次号 6,
    tradeDate: str.subCHString(117, 121), // 交易日期 4,
    tradeTime: str.subCHString(121, 127), // 交易时间  6,
    traceNo: str.subCHString(127, 139), // 参考号 12,
    authCode: str.subCHString(139, 145), // 授权码  6,
    checkoutDate: str.subCHString(145, 149), // 清算日期  4,
    LRC: str.subCHString(149, 152), // LRC校验  3,
    orgTotal: str.subCHString(152, 164), // 原交易金额 12,
    thirdSubsidy: str.subCHString(164, 176), // 第三方补贴 12,
    merchantSubsidy: str.subCHString(176, 188), // 商户补贴 12,
    pointsDeduct: str.subCHString(188, 200), // 积分抵扣 12,
    creditMark: str.subCHString(200, 202), // 借贷记标识 2,
    cardOrg: str.subCHString(202, 205), // 国际卡组织 3,
    thirdPartDes: str.subCHString(205, 405), // 第三方优惠说明   200,
    thirdPartName: str.subCHString(405, 455), // 第三方  50,
    bankOderNo: str.subCHString(455, 505), // 银商订单号  50,
    ERPOderNo: str.subCHString(505, 555), // ERP订单号 50,
    payWay: str.subCHString(555, 556), // 支付方式 1,
    queryResult: str.subCHString(556, 557), // 查询结果 1,
    queryResultDes: str.subCHString(557, 607), // 查询结果描述 50,
    noposQrcode: str.subCHString(607, 807), // 无硬件 C 扫 B 二维码  200,
    noposDatetime: str.subCHString(807, 815), // 无硬件 C 扫 B 账单时间 8,
    noposStatus: str.subCHString(815, 835) // 无硬件 C 扫 B 账单时间 20
  }
}

// 绿博园
function handleLby_yl (str, type) {
  return {
    rescode: str.subCHString(0, 2),
    bankNo: str.subCHString(2, 6),
    cardNo: str.subCHString(6, 26),
    traceNo: str.subCHString(26, 32),
    tradeAmt: str.subCHString(32, 44),
    infoMsg: str.subCHString(44, 84),
    merId: str.subCHString(84, 99),
    terminalNo: str.subCHString(99, 107),
    batchNo: str.subCHString(107, 113),
    tradeDate: str.subCHString(113, 117),
    tradeTime: str.subCHString(117, 123),
    refNo: str.subCHString(123, 135),
    authNo: str.subCHString(135, 141),
    stDate: str.subCHString(141, 145),
    LRC: str.subCHString(145, 148),
    discountAmount: str.subCHString(148, 160),
    cardType: str.subCHString(160, 162),
    thirdPartyDiscountInstrution: str.subCHString(162, 362),
    thirdPartyName: str.subCHString(362, 412),
    unionMerchant: str.subCHString(412, 462),
    erpMerchant: str.subCHString(462, 512),
    payType: str.subCHString(512, 513),
    queryResCode: str.subCHString(513, 514),
    queryResDesc: str.subCHString(514, 564),
    billQRCode: str.subCHString(564, 764),
    billDate: str.subCHString(764, 772),
    status: str.subCHString(772, 792)
  }
}

// 建设银行
function handleLby_jh (str, type) {
  return {
    rescode: str.subCHString(0, 6),
    rescodeInfo: str.subCHString(6, 46),
    posTradeNo: str.subCHString(46, 52),
    authNo: str.subCHString(52, 58),
    refNo: str.subCHString(58, 64),
    cardNo: str.subCHString(64, 83),
    validDate: str.subCHString(83, 87),
    bankNo: str.subCHString(87, 89),
    traceNo: str.subCHString(89, 101),
    terminalNo: str.subCHString(101, 116),
    mchNo: str.subCHString(116, 131),
    tradeAmt: str.subCHString(131, 143),
    tradeIndex: str.subCHString(143, 159),
    customFied: str.subCHString(159, 233),
    cardBankCode: str.subCHString(233, 241),
    bankDate: str.subCHString(241, 249),
    bankTime: str.subCHString(249, 255),
    orderNo: str.subCHString(255, 270),
    tradeCode: str.subCHString(270, 272), // '0’ 银联二维码 ‘1’ 微信 ‘2’ 支付宝 ‘3’ 龙支付
    printType: str.subCHString(272, 273),
    qrCodeOrderNo: str.subCHString(273, 369)
  }
}

// 东方绿洲
function handleDflz (str, type) {
  return {
    rescode: str.subCHString(0, 2), // 返回码 2,
    bankNo: str.subCHString(2, 10), // 发卡行 8,
    cardNo: str.subCHString(10, 30), // 卡号 20,
    refNo: str.subCHString(30, 36), // 凭证号 6,
    actualTotal: str.subCHString(36, 48), // 实扣金额 12,
    errorInfo: str.subCHString(48, 88), // 错误说明  40,
    businessNo: str.subCHString(88, 103), // 商户号  15,
    terminalNo: str.subCHString(103, 111), // 终端号  8,
    batchNo: str.subCHString(111, 117), // 批次号 6,
    tradeDate: str.subCHString(117, 121), // 交易日期 4,
    tradeTime: str.subCHString(121, 127), // 交易时间  6,
    traceNo: str.subCHString(127, 139), // 参考号 12,
    authCode: str.subCHString(139, 145), // 授权码  6,
    checkoutDate: str.subCHString(145, 149), // 清算日期  4,
    LRC: str.subCHString(149, 152), // LRC校验  3,
    orgTotal: str.subCHString(152, 164), // 原交易金额 12,
    thirdSubsidy: str.subCHString(164, 176), // 第三方补贴 12,
    merchantSubsidy: str.subCHString(176, 188), // 商户补贴 12,
    pointsDeduct: str.subCHString(188, 200), // 积分抵扣 12,
    creditMark: str.subCHString(200, 202), // 借贷记标识 2,
    cardOrg: str.subCHString(202, 205), // 国际卡组织 3,
    thirdPartDes: str.subCHString(205, 405), // 第三方优惠说明   200,
    thirdPartName: str.subCHString(405, 455), // 第三方  50,
    bankOderNo: str.subCHString(455, 505), // 银商订单号  50,
    ERPOderNo: str.subCHString(505, 555), // ERP订单号 50,
    payWay: str.subCHString(555, 556), // 支付方式 1,
    queryResult: str.subCHString(556, 557), // 查询结果 1,
    queryResultDes: str.subCHString(557, 607), // 查询结果描述 50,
    noposQrcode: str.subCHString(607, 807), // 无硬件 C 扫 B 二维码  200,
    noposDatetime: str.subCHString(807, 815), // 无硬件 C 扫 B 账单时间 8,
    noposStatus: str.subCHString(815, 835) // 无硬件 C 扫 B 账单时间 20
  }
}

// 西宁童梦乐园
function handleXining (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']
}

function handleFxs (str, type) {
  return {
    transCode: str.subCHString(0, 2),
    tradeType: str.subCHString(2, 4),
    rescode: str.subCHString(4, 6),
    tradeId: str.subCHString(6, 18), // 重要：如果返回00，一定要验证一下外部订单号，防止串包
    terminalNo: str.subCHString(18, 27), // 终端号
    merchantNo: str.subCHString(27, 42), // 商户号
    cardNo: str.subCHString(42, 62),
    tradeAmt: str.subCHString(62, 74),
    dateTime: str.subCHString(74, 88),
    refNo: str.subCHString(88, 118),
    traceNo: str.subCHString(118, 124),
    authCode: str.subCHString(124, 130),
    orderNo: str.subCHString(130, 160),
    errMsg: str.subCHString(160, 190),
    addition: str.subCHString(190, 445)
  }
}
