import { onPageLoadInitAuth, post } from '@/utils/https';
import { formatTime, getAuthInfo, getDataSet, isArray, toArray, toObject } from '@/utils/util';
import { voiceRequest } from '@/utils/voiceUtil';

/** 拼接符号 */
const ProcessCodeConcatSymbol = '&&';
/** 撤回码标记 */
const RecallCodeMarking = '-';

/**
 * 解析流程码
 * @param {string} value
 */
const parseQrCode = (value: string) => {
  value = `${value || ''}`;
  const obj = {
    /** 工序码 */
    code: value,
    /** 提成自定义字段 */
    key: '',
    /** - => 撤回码 */
    type: '',
  };
  if (value.includes(ProcessCodeConcatSymbol)) {
    obj.code = value.substring(0, value.indexOf(ProcessCodeConcatSymbol));
    obj.key = value.substring(
      value.indexOf(ProcessCodeConcatSymbol) + ProcessCodeConcatSymbol.length,
    );
  }

  if (obj.code.includes(RecallCodeMarking)) {
    obj.type = RecallCodeMarking;
    obj.code = obj.code.replace(RecallCodeMarking, '');
  }

  return obj;
};

Page({
  /**
   * 页面的初始数据
   */
  data: {
    action: 'end',
    processCodeMsg: '',
    // rel_order_no: 'XSDD2026011500000190',
    // process_code: 'jd',
    rel_order_no: '',
    process_code: '',
    logsList: [] as any[],
    show: false,
    orders: [] as any[],
    isLogin: false,
    isScanCode: false,
    voice: true,
    loading: true,
    authInfo: {},
    hideTabKeys: [] as string[],
    processItems: [] as any[],
    backFlag: false,
    selectedProcessCode: '',
    result: '',
    logType: '0',
    rel_order_no_temp: '',
  },
  handleLogin(e: any) {
    this.setData({ isLogin: e.detail });
    if (e.detail) {
      this.init();
      this.getExecProcess();
    }
  },
  backChange(e: any) {
    const checked = e.detail.checked;
    this.data.backFlag = checked;
    this.setData({ backFlag: checked });
    wx.setStorageSync('processBackFlag', checked ? 1 : 0);
    if (this.data.selectedProcessCode) {
      const { code, key } = parseQrCode(this.data.selectedProcessCode);
      this.data.selectedProcessCode = `${code}${checked ? RecallCodeMarking : ''}`;
      if (key) {
        this.data.selectedProcessCode += `${ProcessCodeConcatSymbol}${key}`;
      }
    }
    wx.setStorageSync('selectedProcessCode', this.data.selectedProcessCode);
    this.getProcessName();
  },
  getProcessName() {
    if (this.data.selectedProcessCode) {
      const { code, type } = parseQrCode(this.data.selectedProcessCode);
      for (const ell of this.data.processItems) {
        if (ell.process_code == code) {
          this.setData({
            processCodeMsg: `工序名称：${ell.process_name || ''}(${ell.process_code})`,
            selectedProcessCode: this.data.selectedProcessCode,
            process_code: this.data.selectedProcessCode,
            action: type ? 'back' : 'end',
          });
          break;
        }
      }
    }
  },
  processItemTap(e: any) {
    this.data.selectedProcessCode = e.currentTarget.dataset.code + (this.data.backFlag ? '-' : '');
    wx.setStorageSync('selectedProcessCode', this.data.selectedProcessCode);
    this.setData({
      selectedProcessCode: this.data.selectedProcessCode,
    });

    this.getProcessName();
  },
  getExecProcess() {
    return new Promise<void>((resolve, reject) => {
      post('CompanyProcessV2/getProcessByCode')
        .then((res: any) => {
          this.data.processItems = toArray(res.data);
          if (this.data.processItems.length == 1) {
            this.data.selectedProcessCode = this.data.processItems[0].process_code;
            this.getProcessName();
          } else {
            this.getProcessName();
          }
          this.setData({
            processItems: this.data.processItems,
            isLogin: true,
          });
          resolve(res);
        })
        .catch((res) => {
          this.setData({ isLogin: false });
          reject(res);
        });
    });
  },
  init() {
    const companyInfo = toObject(wx.getStorageSync('company_info'));
    const code = wx.getStorageSync('selectedProcessCode') || '';
    this.data.selectedProcessCode = code;
    this.data.process_code = code;
    this.data.backFlag = wx.getStorageSync('processBackFlag') == 1;
    const logType = wx.getStorageSync('processEntry_logType');

    this.setData({
      authInfo: getAuthInfo(),
      hideTabKeys: companyInfo.staff_type == 3 ? ['2'] : [],
      backFlag: this.data.backFlag,
      selectedProcessCode: code,
      process_code: code,
      logType: logType || 0,
    });
  },
  voiceChange(event: any) {
    this.setData({
      voice: event.detail,
    });
    wx.setStorageSync('processEntryVoice', `${event.detail}`);
  },
  getVoice(msg: string, cacheVoice?: boolean) {
    return;
    if (this.data.voice && msg) {
      voiceRequest(msg, cacheVoice);
    }
  },
  onLogTypeChange(e: any) {
    const data = getDataSet(e);
    this.setData({ logType: data.key });
    wx.setStorageSync('processEntry_logType', data.key);
  },
  scanCode() {
    this.data.isScanCode = true;
    wx.scanCode({
      onlyFromCamera: true,
      scanType: ['qrCode'],
      success: (res) => {
        console.log(res);
        const qrcode = res.result || '';

        if (qrcode) {
          if (qrcode.startsWith('XSDD')) {
            if (this.data.process_code) {
              this.data.rel_order_no = qrcode;
              this.setData({
                rel_order_no: qrcode,
              });
              this.processEnter();
            } else {
              wx.showToast({ title: '请扫流程码', icon: 'none' });
            }
          } else {
            const code = parseQrCode(qrcode);
            this.setData({
              action: code.type == RecallCodeMarking ? 'back' : 'end',
              rel_order_no: '',
            });
            this.getProcess(qrcode);
          }
        }
        this.setData({
          msg: JSON.stringify(res),
        });
      },
      complete: () => {
        this.data.isScanCode = false;
      },
    });
  },
  getProcess(process_code: any) {
    const code = parseQrCode(process_code);
    post('/CompanyProcessV2/getProcessByCode', {
      curr_page: 1,
      page_count: 1,
      process_code: code.code,
    })
      .then((res: any) => {
        const data = res.data;
        if (Array.isArray(res.data) && data.length) {
          this.setData({
            processCodeMsg: `工序名称：${data[0].process_name || ''}(${process_code})`,
            process_code: process_code,
            selectedProcessCode: process_code,
          });
          this.getVoice(`${data[0].process_name}工序`, true);
          wx.showToast({ title: '请扫订单二维码', icon: 'none' });
        } else {
          this.addMsg('未找到 ' + process_code + ' 工序');
          wx.showToast({ title: '未找到该工序', icon: 'error' });
          this.getVoice(`未找到工序`, true);
        }
      })
      .catch(() => {
        this.addMsg('未找到 ' + process_code + ' 工序');
        wx.showToast({ title: '未找到该工序', icon: 'error' });
      });
  },
  processEnter() {
    if (this.data.rel_order_no && this.data.process_code) {
      this.data.rel_order_no_temp = this.data.rel_order_no;
      this.setProcess();
    }
  },
  LCProcessEnter(e: any) {
    const item = this.data.orders[e.currentTarget.dataset.index];
    this.data.rel_order_no_temp = item.order_no;
    this.setProcess({
      info_process_id: JSON.stringify([item.info_process_id]),
      action: this.data.action,
      if_scan: 1,
    });
  },
  setProcess(other?: any) {
    const code = parseQrCode(this.data.process_code);
    const obj: any = {};
    if (code.key) {
      obj[this.data.rel_order_no_temp] = code.key;
    }
    post(
      'ProduceOrder/setProcessV2',
      other
        ? other
        : {
            order_no: this.data.rel_order_no_temp,
            process_code: code.code,
            action: this.data.action,
            if_scan: 1,
          },
    )
      .then((res: any) => {
        if (isArray(res.data) && res.data.length) {
          res.data.forEach((el: any) => {
            el.product_info_str = toArray(el.product_info)
              .map((ell) => {
                return `${ell.room_name || '未命名'}(${ell.goods_name || '未命名'})`;
              })
              .join('，');

            el.sale_info_str = toArray(el.sale_info)
              .map((ell) => {
                return `${ell.goods_name}`;
              })
              .join('，');
          });

          this.setData({
            show: true,
            orders: res.data,
          });
        } else {
          this.addMsg(res.err_msg);
          // this.getVoice(res.err_msg);
          this.getVoice('通过');
          this.setData({
            show: false,
            result: 'success',
          });
          wx.showToast({
            title: res.err_msg,
            icon: 'none',
          });
        }
      })
      .catch((res: any) => {
        this.addMsg(res.err_msg);
        if (res.err_code == '244269') {
          this.setData({
            result: 'success',
          });
          wx.showToast({
            title: res.err_msg,
            icon: 'none',
          });
          this.getVoice('通过');
        } else {
          this.setData({
            result: 'error',
          });
          this.getVoice(res.err_msg);
        }
      });
  },

  addMsg(msg: any) {
    const now = new Date();
    this.data.logsList.unshift({
      date: formatTime(now).substring(5),
      msg: msg || '',
    });
    if (this.data.logsList.length > 100) {
      this.data.logsList.length = 100;
    }
    this.setData({
      logsList: this.data.logsList,
    });
  },
  clearMsg() {
    this.setData({ logsList: [] });
  },
  show() {
    this.setData({ show: true });
  },
  onClose() {
    this.setData({ show: false });
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(_options) {
    this.setData({
      loading: true,
      voice: wx.getStorageSync('processEntryVoice') == 'false' ? false : true,
    });
    onPageLoadInitAuth(this, () => this.getExecProcess());
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {},

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    wx.hideHomeButton();
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {},

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {},

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {},

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {},

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {},
});
