import { hiprint } from 'vue-plugin-hiprint'
import vueMain from '@/main'
import TaskRunner from 'concurrent-tasks'

/**
 * @desc   : 通用打印方法
 * @author : 张潇木
 * @remark : 注意传入数据结构，明细信息key值固定为table
 * @date   : 2023/7/17 16:21
 * @param {*} template    打印模板json  （应为打印模板的[layoutData]）
 * @param {*} printData   打印数据      （调用存储过程后得到的返回值）
 * @param {*} copies      打印份数
 */
let print = function (template, printData, copies = 1) {
  //创建模板
  let hiprintTemplate = new hiprint.PrintTemplate({
    template: template,
  })

  hiprintTemplate.print(printData, { title: '单据打印' })

}

/**
 * @desc   : 调用打印机打印
 * @author : 张潇木
 * @date   : 2023/8/10 14:18
 */
let callPrint=function (hiprintTemplate,printData,printer,copies){
  console.log('打印数据：', printData)
  console.log('模板：', hiprintTemplate)
  console.log('当前打印机', printer)
  console.log('打印机列表', hiprintTemplate.getPrinterList())
  console.log('打印份数', copies)
  //3.调用打印机进行打印
  if (copies > 1) {
    //批量打印
    tasksPrint(hiprintTemplate, printData, printer, copies)
  } else {
    hiprintTemplate.print2(printData, { printer: printer, title: 'DK打印' })
  }
}
/**
 * @desc   : 获取[系统参数]-[标签打印服务地址]
 * @author : 张潇木
 * @date   : 2023/7/18 8:57
 */
let getHost = function () {

  let params = {
    code: 'SYS_001',
    ftyId: vueMain.$store.state.user.ftyId,
  }
  return new Promise((resolve, reject) => {
    vueMain.excute(vueMain.$service.commonService, vueMain.$service.commonService.getSettingValue, params).then(res => {
      if (res.code === vueMain.$config.SUCCESS_CODE && res.data != null) {
        resolve(res.data)
      } else {
        vueMain.$Message.error('获取 [ 系统参数 ] - [ 标签打印服务地址 ] 失败')
        reject(err)
      }
    }, err => {
      vueMain.$Message.error('获取 [ 系统参数 ] - [ 标签打印服务地址 ] 失败')
      reject(err)
    })
  })
}

/**
 * @desc   : 连接打印服务
 * @author : 张潇木
 * @date   : 2023/7/18 8:58
 */
let connectPrintServer = function (host) {
  return new Promise((resolve, reject) => {
    //调用打印服务
    vueMain.$dkprint.hiwebSocket.setHost(host, (connected, e) => {
      // vueMain.$dkprint.hiwebSocket.setHost('http://192.168.0.215:17522', (connected, e) => {
      if (connected) {
        resolve()
      }
      //todo 没有回调能够获取打印机连接失败
    })
  })
}

/**
 * @desc   : 获取打印机列表
 * @author : 张潇木
 * @date   : 2023/7/18 13:39
 */
let getPrinterList = function () {
  //1.获取[系统参数]-[标签打印服务地址]
  return getHost().then(host => {
    //2.调用连接打印服务
    return connectPrintServer(host)
  }).then(res => {
    let hiprintTemplate = new hiprint.PrintTemplate()
    return hiprintTemplate.getPrinterList()
  }).catch(() => {
    vueMain.$Message.error('获取 [ 打印机列表 ] 失败')
  })
}

/**
 * @desc   : 批量打印方法
 * @author : 张潇木
 * @date   : 2023/8/1 10:19
 */
let tasksPrint = function (hiprintTemplate, printData, printer, copies) {
  const runner = new TaskRunner()
  runner.setConcurrency(1) // 同时执行数量
  const task = []
  for (let i = 1; i <= copies; i++) {
    // done -> 任务完成回调
    let key = `task${i}`
    task.push(done => {
      callPrintMultiple(hiprintTemplate, runner, key, done, printData, printer)
    })
  }
  runner.addMultiple(task)
}

/**
 * @desc   : 调用打印机打印
 * @author : 张潇木
 * @date   : 2023/8/1 10:29
 */
let callPrintMultiple = function (hiprintTemplate, runner, key, done, printData, printer) {
  hiprintTemplate.print2(printData, { printer: printer, title: 'DK批量打印' })
  hiprintTemplate.on('printSuccess', function () {
    console.log(key + '成功')
    done()
  })
  hiprintTemplate.on('printError', function () {
    console.log(key + '失败，尝试重新加入队列……')
    done()
    runner.add(callPrintMultiple(hiprintTemplate, runner, key, done, printData, printer))
  })
}


export default { print, getPrinterList,getHost,connectPrintServer}
