// 菜鸟打印
import React, { useEffect, useRef, useState } from 'react';
import message from 'antd/lib/message';
import Modal from 'antd/lib/modal';
import Progress from 'antd/lib/progress';
import { RendererEnv } from '../../../env';
import { fetcherConfig } from '../../../factory';
import { Shell } from '../../../utils/shell';

interface IRequest {
  protocol: string;
  bodyParams: any;
  downloadUrl: string;
  url: string;
  group?: string;
}

export interface IExpress {
  before: IRequest[];
  after: fetcherConfig;
}

type Translate = (str: any, data?: object | undefined) => any

const DealContent: React.FC = () => {

  const [percent, setPercent] = useState(0)

  const interval = useRef<NodeJS.Timeout>()

  useEffect(() => {
    interval.current = setInterval(() => {
      setPercent(percent => {
        const sum = percent + 8
        if (sum < 100) {
          return sum
        }
        return percent
      })
    }, 1000)

    return () => {
      interval.current && clearInterval(interval.current)
    }
  }, [])

  return (
    <div>
      <div style={{ marginBottom: 8 }}>任务正在执行中,请稍等</div>
      <Progress percent={percent} size="small" showInfo={false} />
    </div>
  )
}

// 预览、打印
export async function expressLabels(expressList: IExpress, fetcher: RendererEnv['fetcher'], translate: Translate, showModal: boolean = false) {
  const modal = showModal ? Modal.info({ title: '正在处理中', content: <DealContent />, okButtonProps: { style: { display: 'none' } } }) : undefined
  const { openWs, closeWs } = fetchWs(translate)
  const { before, after } = expressList;
  const printResult: any[] = []
  const content = before.map(item => ({ group: item.group, url: item.downloadUrl }))
  const uniqueArray = content.filter((obj, index, self) => {
    return index === self.findIndex((el) => (
      el.group === obj.group && el.url === obj.url
    ));
  });

  for (const item of before) {
    const isWs = ['ws', 'wss'].includes(item.protocol);
    // item.bodyParams.task.printer = 'pdfFactory Pro' // 调试用，因为打印机是数据库那边配置，这里设置为本地的虚拟打印机
    // if (preview) {
    //   item.bodyParams.task.preview = true
    //   item.bodyParams.task.printer = ""
    //   item.bodyParams.task.previewType = "pdf"
    // }
    if (isWs) {
      await openWs(item, printResult, uniqueArray).catch(() => { modal?.destroy() }).finally(() => { closeWs() })
    }
  }
  if (after) {
    const res = await fetcher(after, { port_result: printResult })
    const data = res.data == null ? null : (res.data?.data == null && res.data?.status == 0) ? null : res.data
    if (res.ok && data != null) {
      await expressLabels(data, fetcher, translate)
    }
  }
  modal?.destroy()
  message.success({ content: '打印完成', key: 'success-print' })
}

const fetchWs = (translate: Translate) => {
  let wsInstance: WebSocket | null

  const openWs = (before: IRequest, printResult: any[], uniqueArray: any[]) => {
    return new Promise((resolve, reject) => {
      const params = before.bodyParams
      wsInstance = new WebSocket(before.url)
      wsInstance.onopen = function (this: WebSocket, _ev: Event) {
        this.send(typeof params == 'string' ? params : JSON.stringify(params));
      }
      wsInstance.onerror = () => {
        showErrorMessage(translate, uniqueArray)
        reject()
      }
      wsInstance.onmessage = function (evt: MessageEvent<any>) {
        const wsData = JSON.parse(evt.data)
        // 菜鸟,抖音,快手; PDD
        if (wsData.cmd == 'notifyPrintResult' || wsData.cmd == 'PrintResultNotify' || wsData.cmd == 'notifyDocResult') {
          if (wsData.taskStatus == 'printed' || wsData.taskStatus == 'partPrinted' || wsData.status == 'printed') {
            printResult.push(wsData)
            resolve(0)
          } else if (wsData.taskStatus == 'failed') {
            printResult.push(wsData)
            message.error({ content: wsData.printStatus?.[0]?.msg, key: 'failed-print' })
            resolve(0)
          }
          // JD
        } else if (wsData.success == 'true' && wsData.status == '500') {
          printResult.push(wsData)
          resolve(0)
          // JD
        } else if (wsData.success == 'false' && wsData.status != '500') {
          printResult.push(wsData)
          message.error({ content: wsData.message, key: 'failed-print' })
          resolve(0)
        }
      }
    })
  }

  const closeWs = () => {
    wsInstance?.close()
  }

  return { openWs, closeWs }
}

// 获取打印机列表
export async function cainiaoGetPrinters(wsUrl: string, translate: Translate) {
  return new Promise<any>((resolve, reject) => {
    const wsInstance: WebSocket = new WebSocket(wsUrl)
    wsInstance.onerror = () => {
      showErrorMessage(translate)
      reject()
    }
    wsInstance.onopen = function (this: WebSocket, _ev: Event) {
      this.send(JSON.stringify({
        cmd: "getPrinters",
        requestID: +new Date(),
        version: "1.0"
      }))
    }
    wsInstance.onmessage = function (evt: MessageEvent<any>) {
      const wsData = JSON.parse(evt.data)
      if (wsData.status === 'success') {
        if (wsData.cmd === 'getPrinters') {
          resolve(wsData)
          wsInstance.close()
        }
      }
    }
  })
}

const showPreviewModal = (previewURL: string, translate: Translate) => {
  const id = `pdf${+new Date()}`
  const embed = <embed id={id} src={previewURL} type="application/pdf" style={{ width: 800, height: 700, maxHeight: 'calc(100vh - 275px)' }} />
  Modal.info({
    title: <span style={{ fontSize: 15 }}>{translate('preview')}</span>,
    content: embed,
    width: 900,
    style: {
      top: 1,
      paddingBottom: 0
    },
    bodyStyle: {
      maxHeight: 'calc(100vh - 50px)'
    }
  })
}

const showErrorMessage = (translate: Translate, uniqueArray?: any[]) => {
  const downloadUrl = "https://page.cainiao.com/waybill/cloud_printing/home.html"
  const structure = uniqueArray ? <div style={{ display: 'inline-block' }}  >
    {uniqueArray.map((item, index) =>
      <div key={index}>
        <span >{item.group + translate('CRUD.cloudPrintNotConnect')}
          <span style={{ cursor: 'pointer', color: '#40a9ff' }} onClick={() => Shell.openFile(2, "", item.url)}>{translate('downloadUrl')}</span>
          {/* <a href={item.url} target="_blank" rel="noopener noreferrer"> {translate('downloadUrl')}</a> */}
        </span>
      </div>
    )}
  </div> : false
  message.error({
    content: (
      structure ? structure :
        <span> {translate('CRUD.cloudPrintNotConnect')}
          <a href="https://page.cainiao.com/waybill/cloud_printing/home.html" target="_blank" rel="noopener noreferrer">{translate('downloadUrl')}</a>
        </span>

    )
  })
}
