import confirm from 'ant-design-vue/es/modal/confirm'
import notification from 'ant-design-vue/es/notification'
import { getLodop } from '@/libs/LodopFuncs'
import { printLogSave, printLogSaveBatch } from '@/api/data'
import moment from 'moment'
// 打印页签,支持批量打印
export const JGPrintTag = function (html, width, height, data) {
  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
  if (!LODOP) {
    confirm({
      title: '提示?',
      content: h => <div>打印控件未安装，请先下载并安装。安装完成后，刷新页面即可打印。</div>,
      okText: '立即下载',
      okType: 'danger',
      cancelText: '暂不打印',
      onOk () {
        var agent = navigator.userAgent.toLowerCase()
        if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
          window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
        } else if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
          window.open('https://www.lodop.net/download/CLodop_Setup_for_Win64NT_6.611EN.zip')
        }
      }
    })
    return
  }
  LODOP.PRINT_INIT('')
  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
  LODOP.SET_PRINT_MODE('POS_BASEON_PAPER', true) // 可使输出以纸张边缘为基点
  LODOP.ADD_PRINT_HTML(0, 0, '100%', '100%', html)
  LODOP.ADD_PRINT_BARCODE('36%', '65%', 90, 90, 'QRCode', data.qrCodeContent)
  LODOP.SET_PRINT_STYLEA(0, 'QRCodeVersion', 5)
  // LODOP.SET_PRINT_STYLEA(0,"QRCodeErrorLevel",'H')
  LODOP.SET_PRINT_COPIES(data.printQty)// 指定份数
  LODOP.SET_PRINT_PAGESIZE(1, width, height)
  LODOP.PRINT()
}
// 导出文件
export const exportExcel = function (url, params, fileName, callback, noShowTime) {
  url(params).then(res => {
    if (res.type == 'application/json') {
      var reader = new FileReader()
      reader.addEventListener('loadend', function () {
        const obj = JSON.parse(reader.result)
        notification.error({
          message: '提示',
          description: obj.message
        })
      })
      reader.readAsText(res)
    } else {
      downloadExcel(res, fileName, noShowTime)
    }
    callback()
  })
}
// 下载excel
export const downloadExcel = function (data, fileName, noShowTime) {
  if (!data) { return }
  const a = moment().format('YYYYMMDDHHmmss')
  const fname = noShowTime ? fileName : (fileName + a)
  const blob = new Blob([data], { type: 'application/vnd.ms-excel' })
  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, fname + '.xlsx')
  } else {
    const link = document.createElement('a')
    link.style.display = 'none'
    var href = URL.createObjectURL(blob)
    link.href = href
    link.setAttribute('download', fname + '.xlsx')
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(href) // 释放掉blob对象
  }
}

// pdf blob 转 base64
export const blobToBaseByPdf = function (data, callback) {
  const reader = new FileReader()
  reader.readAsDataURL(new Blob([data], { type: 'application/pdf' }))
  reader.addEventListener('load', () => {
    callback(reader.result)
  })
}

// 打印html
export const jGPrint = function (data, type, callback, printLogParams, printPageSize) {
  if (!data) {
    return
  }
  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
  if (!LODOP) {
    confirm({
      title: '提示?',
      content: h => <div>打印控件未安装，请先下载并安装。安装完成后，刷新页面即可打印。</div>,
      okText: '立即下载',
      okType: 'danger',
      cancelText: '暂不打印',
      onOk () {
        var agent = navigator.userAgent.toLowerCase()
        if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
          window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
        } else if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
          window.open('http://www.lodop.net/download/CLodop_Setup_for_Win64NT_4.155EN.zip')
        }
      }
    })
    return
  }
  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
  // 执行该语句之后，PRINT指令不再返回那个所谓“打印成功”，才能获取到打印状态
  // LODOP.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
  // TaskID:任务id，Value：job代码
  LODOP.On_Return = function (TaskID, Value) {
    console.log(TaskID, Value, printLogParams)
    // 已打印
    if (Value) {
      if(printLogParams){
        console.log('已打印,统计打印次数')
        printLog(printLogParams, callback)
      }else{
        callback({status:200,message:'已打印'})
      }
    } else {
      // 取消打印
      callback()
    }
  }
  if (printPageSize) {
    LODOP.SET_PRINT_PAGESIZE(3, '210mm', 100, '')
  } else {
    LODOP.SET_SHOW_MODE('BKIMG_PRINT', 0)
    LODOP.SET_PRINT_PAGESIZE(1,'210mm','297mm',"");
  }
  LODOP.ADD_PRINT_HTM(0, 0, '100%', '99%', data)

  if (type == 'preview') { //  预览
    LODOP.PREVIEW()
  } else if (type == 'print') { //  打印
    LODOP.PRINTA()
  }
}

// 自动排版， 遍历数组，将数组中每一个数值加起来，如果和小于某个数，则将这些数值存放到一个新数组中。
export const groupLessThan = function(html,isNoMerge) {
  const pageMidHeight = 530 // 半页高度
  const pageHeight = pageMidHeight*2 // 页高度
  const arr = []
  const result = []
  for (let i = 0; i < html.length; i++) {
    const h = html[i].clientHeight // 总高度
    const pz = h<=pageMidHeight ? '0.5' : (h/pageHeight).toFixed(2) // 页数
    const t = '<div style="height:'+(pz<=0.5?pageMidHeight:'auto')+'px'+';border:1px solid #fff;">'+html[i].innerHTML+'</div>'
    arr.push({
      h: h,
      pz: pz,
      t: t,
      flag: 0
    })
    // 不合并纸张打印
    if(isNoMerge){
      result.push(t)
    }
  }
  // 不合并纸张打印
  if(isNoMerge){
    return result
  }
  console.log(arr)
   // 找出所有小于半张纸的
   const a = arr.filter(item => item.pz <= 0.5)
   // 先找出所有超过半张纸的，小于一张纸的
   const b = arr.filter(item => item.pz >0.5 && item.pz <= 1)
   // 找出所有超过一张纸的
   const c = arr.filter(item => item.pz > 1)
   // 先给c 找匹配的另一半
   for(let i=0;i<c.length;i++){
    const pz = Number(c[i].pz.split('.')[1])
    // 先从b中找
    const hasOther = b.findIndex(item => (item.pz + pz) < 1)
    if(hasOther>=0){
      result.push(c[i].t + b[hasOther].t)
      // 删除hasOther
      b.splice(hasOther,1)
    }else{
      // 再从a中找
      const hasOtherA = a.findIndex(item => (item.pz + pz) < 1)
      if(hasOtherA>=0){
        result.push(c[i].t + a[hasOtherA].t)
        // 删除hasOtherA
        b.splice(hasOther,1)
      }else{
        // 都没匹配到
        result.push(c[i].t)
      }
    }
   }

   // 将b依次加入
   for(let i=0;i<b.length;i++){
    result.push(b[i].t)
   }

   // 将a中每2个放到一个容器中
   if(a.length%2!=0){
    a.push({t:''})
   }
   for(let i=0;i<a.length;i=i+2){
    result.push(a[i].t + a[i+1].t)
   }

  //  console.log(a)
  //  console.log(b)
  //  console.log(c)
  //  console.log(result)
   return result
}

// 批量打印销售收款单html
export const jGPlPrint = function (data, type, callback, printLogParams, taskName) {
  if (!data) {
    return
  }
  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
  if (!LODOP) {
    confirm({
      title: '提示?',
      content: h => <div>打印控件未安装，请先下载并安装。安装完成后，刷新页面即可打印。</div>,
      okText: '立即下载',
      okType: 'danger',
      cancelText: '暂不打印',
      onOk () {
        var agent = navigator.userAgent.toLowerCase()
        if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
          window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
        } else if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
          window.open('http://www.lodop.net/download/CLodop_Setup_for_Win64NT_4.155EN.zip')
        }
      }
    })
    return
  }
  LODOP.PRINT_INIT(taskName)
  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
  // 执行该语句之后，PRINT指令不再返回那个所谓“打印成功”，才能获取到打印状态
  // LODOP.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
  // TaskID:任务id，Value：job代码
  LODOP.On_Return = function (TaskID, Value) {
    console.log(TaskID, Value!=0, printLogParams)
    // 已打印
    if (Number(Value)) {
      if(printLogParams){
        console.log('已打印,统计打印次数')
        printLog(printLogParams, callback)
      }else{
        callback({status:200,message:'已打印'})
      }
    } else {
      // 取消打印
      callback()
    }
  }
  LODOP.SET_PRINT_PAGESIZE(1,'210mm','297mm',"");
  LODOP.SET_SHOW_MODE('BKIMG_PRINT', 0)

  if(data.length>1){
    // 循环页
    for(var i=0;i<data.length;i++){
      LODOP.NewPageA();
      LODOP.ADD_PRINT_HTM(0, 0, '100%', '99%', data[i])
    }
  }else{
    LODOP.ADD_PRINT_HTM(0, 0, '100%', '99%', data[0])
  }
  
  if (type == 'preview') { //  预览
    LODOP.PREVIEW()
  } else if (type == 'print') { //  打印
    LODOP.PRINTA()
  }
}

// 浏览器打印pdf功能
export const winPrintPdf = function (data, type, callback) {
  if (!data) {
    return
  }
  const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
  document.getElementById('print').innerHTML = '<iframe id="printfbod" name="printfbod" src="' + url + '" hidden></iframe>'
  window.frames['printfbod'].onload = function () {
    callback()
  }
  if (type == 'orginPrint') {
    window.frames['printfbod'].focus()
    window.frames['printfbod'].print()
  } else {
    window.open(url)
  }
}
// 打印
export const printFun = function (url, params, type, taskName, callback, printLogParams, hidePrint) {
  url(params).then(res => {
    if (res.type == 'application/json') {
      var reader = new FileReader()
      reader.addEventListener('loadend', function () {
        const obj = JSON.parse(reader.result)
        notification.error({
          message: '提示',
          description: obj.message
        })
      })
      reader.readAsText(res)
    } else {
      // 使用浏览器自带打印功能
      if (type == 'orginPrint' || type == 'orginPreview') {
        winPrintPdf(res, type, callback)
      } else {
        jGPrintPdf(res, type, taskName, printLogParams, callback, hidePrint)
      }
    }
  })
}
// 获取系统信息
export const getSystemInfo = function (strINFOType, callback) {
  LODOP = getLodop()
  if (LODOP.CVERSION) CLODOP.On_Return = function (TaskID, Value) { callback(Value) }
  var strResult = LODOP.GET_SYSTEM_INFO(strINFOType)
  if (!LODOP.CVERSION) return strResult; else return ''
}
// 打印记录保存
export const printLog = function (data, callback) {
  getSystemInfo('NetworkAdapter.1.IPAddress', function (ret) {
    // 批量处理
    if (data instanceof Array) {
      data.map(item => { item.printIp = ret })
      printLogSaveBatch(data).then(res => {
        callback(res)
      })
    } else {
      // 单条处理
      data.printIp = ret
      printLogSave(data).then(res => {
        callback(res)
      })
    }
  })
}
// 打印pdf
export const jGPrintPdf = function (data, type, taskName, printLogParams, callback, hidePrint) {
  if (!data) {
    return
  }
  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
  if (!LODOP) {
    confirm({
      title: '提示?',
      content: h => <div>打印控件未安装，请先下载并安装。安装完成后，刷新页面即可打印。</div>,
      okText: '立即下载',
      okType: 'danger',
      cancelText: '暂不打印',
      onOk () {
        var agent = navigator.userAgent.toLowerCase()
        if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
          window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
        } else if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
          window.open('http://www.lodop.net/download/CLodop_Setup_for_Win64NT_4.155EN.zip')
        }
      }
    })
    return
  }
  blobToBaseByPdf(data, function (dataurl) {
    // console.log(dataurl)
    LODOP.PRINT_INIT(taskName)
    LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
    // 执行该语句之后，PRINT指令不再返回那个所谓“打印成功”，才能获取到打印状态
    // LODOP.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
    // 隐藏打印按钮
    if (hidePrint) {
      LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_PREVIEW', true)
    }
    // TaskID:任务id，Value：job代码
    LODOP.On_Return = function (TaskID, Value) {
      console.log(TaskID, Value!=0, printLogParams)
      // 已打印
      if (Value!=0) {
        if(printLogParams){
          console.log('已打印,统计打印次数')
          printLog(printLogParams, callback)
        }else{
          callback({status:200,message:'打印已完成'})
        }
      } else {
        callback()
      }
    }
    LODOP.ADD_PRINT_PDF(0, 0, '100%', '100%', dataurl.replace('data:application/pdf;base64,', ''))

    if (type == 'preview') { //  预览
      LODOP.PREVIEW()
    } else if (type == 'print') { //  打印
      LODOP.PRINTA()
    }
  })
}

// printBase64Fun
export const printBase64Fun = function (url, params, type, taskName, callback, printLogParams, hidePrint) {
  url(params).then(res => {
    if (res.type == 'application/json') {
      var reader = new FileReader()
      reader.addEventListener('loadend', function () {
        const obj = JSON.parse(reader.result)
        notification.error({
          message: '提示',
          description: obj.message
        })
      })
      reader.readAsText(res)
    } else {
      // 使用浏览器自带打印功能
      if (type == 'orginPrint' || type == 'orginPreview') {
        winPrintPdf(res, type, callback)
      } else {
        jGPrintBase64Pdf(res.data, type, taskName, printLogParams, callback, hidePrint)
      }
    }
  })
}
// 打印pdf
export const jGPrintBase64Pdf = function (dataurl, type, taskName, printLogParams, callback, hidePrint) {
  if (!dataurl) {
    return
  }
  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
  if (!LODOP) {
    confirm({
      title: '提示?',
      content: h => <div>打印控件未安装，请先下载并安装。安装完成后，刷新页面即可打印。</div>,
      okText: '立即下载',
      okType: 'danger',
      cancelText: '暂不打印',
      onOk () {
        var agent = navigator.userAgent.toLowerCase()
        if (agent.indexOf('win32') >= 0 || agent.indexOf('wow32') >= 0) {
          window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
        } else if (agent.indexOf('win64') >= 0 || agent.indexOf('wow64') >= 0) {
          window.open('http://www.lodop.net/download/CLodop_Setup_for_Win64NT_4.155EN.zip')
        }
      }
    })
    return
  }
  
  LODOP.PRINT_INIT(taskName)
  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
  // 执行该语句之后，PRINT指令不再返回那个所谓“打印成功”，才能获取到打印状态
  // LODOP.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
  // 隐藏打印按钮
  if (hidePrint) {
    LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_PREVIEW', true)
  }
  // TaskID:任务id，Value：job代码
  LODOP.On_Return = function (TaskID, Value) {
    console.log(TaskID, Value!=0, printLogParams)
    // 已打印
    if (Value!=0) {
      if(printLogParams){
        console.log('已打印,统计打印次数')
        printLog(printLogParams, callback)
      }else{
        callback({status:200,message:'打印已完成'})
      }
    } else {
      callback()
    }
  }
  for(let i=0;i<dataurl.length;i++){
     LODOP.NewPageA()
     LODOP.ADD_PRINT_PDF(0, 0, '100%', '100%', dataurl[i])
  }

  if (type == 'preview') { //  预览
    LODOP.PREVIEW()
  } else if (type == 'print') { //  打印
    LODOP.PRINTA()
  }
}

// 获取打印机状态
export const getStatusValue = function (ValueType, ValueIndex, callback) {
  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
  if (LODOP.CVERSION) {
    LODOP.On_Return = function (TaskID, Value) {
      callback(Value)
    }
  }
  var strResult = LODOP.GET_VALUE(ValueType, ValueIndex)
  if (!LODOP.CVERSION) return callback(strResult); else return callback('')
}
