import Bridge from '../components-control/util/bridge'
import SelectApprovers from '../components-control/select-approvers.vue'
import { compareData } from "../components-control/util/dataChange"
export default {
  execute: function (bill, param) {
    if (bill) {
      if (!bill.getGlobalParam('reviewParam') || !bill.getGlobalParam('reviewParam').taskId) {
        GMS.$hideContainer.$Message.error('请配置审批轨迹')
        return
      }
      if (!this.isApproverEqulloginer(bill, param)) {
        GMS.$hideContainer.$Message.error('单据审批状态已发生变化,请刷新界面')
        return
      } 
      let curTagId = window.nros.context.getCurrTag();
      let oldObj = curTagId && GMS.oldBillDataMap[curTagId]?GMS.oldBillDataMap[curTagId]:GMS.oldBillData;
      let flag = compareData(oldObj, bill.getBuillData()) || bill.getGlobalParam("noRunTimeFormula");
      if (flag) {
        this.approvalLogical(bill, param, this)
      } else {
        bill.runFormulaCheckData(param, (msg) => {
          if (msg.length == 0) {
            GMS.$hideContainer.$Modal.confirm({
              title: "信息提示",
              content: "信息发生变化, 是否保存",
              onOk: () => {
                this.saveLogical(bill, param, {data: bill.getBuillData(), detailData: []}, this) 
              },
              onCancel: () => {
              }
            })
          } else {
            GMS.vbus.$Modal.warning({
              title: "信息错误",
              content: msg,
            });
          }
        });
      }
    } else {
      GMS.$hideContainer.$Message.error('缺少参数');
    }
  },
  saveLogical: function (bill, param, postData) {
    let url = `/rbc/bill/action/executed/${param.define}/bill.Basic.save?transmission=total`
    GMS.$http.post(url, JSON.stringify(postData), {
      headers: {
        post: {
          "Content-Type": "application/json",
        },
      },
    })
    .then((response) => {
      if (response.data.code == 0) {
        let curTagId = window.nros.context.getCurrTag();
        if (curTagId) {
          GMS.oldBillDataMap[curTagId] = bill.getBuillData()
        }
        else {
          GMS.oldBillData = bill.getBuillData()
        }
        this.approvalLogical(bill, param)
      } else {
        response.data.message && GMS.vbus.$Message.error({
          content: response.data.message,
          duration: 3
        });
      }
    })
  },
  approvalLogical: function (bill, param) {
    let taskId = bill.getGlobalParam('reviewParam').taskId;
    bill.setControlsSate(param["_control_name_"], "enable", false)
    let selectedApprovers = []
    window.GMS.$http.get(`/bpm/bill/selectApprover/ApproverList/${taskId}`).then((res) => {
      if (res.data.code == 204) {
        this.executeApproval(bill, param)
        return
      }
      else if (res.data.code != 200) {
        bill.setControlsSate(param["_control_name_"], "enable", true)
        GMS.$hideContainer.$Message.error(res.data.msg || '提交失败,请联系系统管理员');
        return
      }
      bill.setControlsSate(param["_control_name_"], "enable", true)
      const nodeData = res.data.ApproverVo
      const optionList = [...nodeData.approvers]
      if (optionList.length == 0) {
        GMS.$hideContainer.$Message.error('未找到下一节点的审批人')
        return
      }
      GMS.$hideContainer.$Modal.confirm({
        width: 700,
        render: (h) => {
          return h(
            SelectApprovers,
            {
              props: {
                optionList,
              },
              on: {
                'on-change': (val) => {
                  selectedApprovers = val
                }
              }
            }
          )
        },
        onOk: () => {
          window.GMS.$http.post(
            '/bpm/bill/selectApprover/addApprovers',
            {
              ...nodeData,
              approvers: selectedApprovers,
            }
          ).then(() => {
            this.executeApproval(bill, param)
          }).catch(() => {
            GMS.$hideContainer.$Message.error('选择审批人发生错误')
          })
        },
        onCancel: () => {
        }
      });
    }).catch(() => {
      GMS.$hideContainer.$Message.error('未找到下一节点的审批人');
    })
  },
  executeApproval: function(bill, param) {
    if (param.param.actions) {
      let saveParam = {
        actions: param.param.actions
      }
      bill.executeServerAction(saveParam, function (code, data) {
        if (code === 200) {
          this.approval(bill, param);
        } else {
          bill.setControlsSate(param["_control_name_"], "enable", true)
          if (data.message.includes('还款金额不能大于未还金额')) {
            GMS.$hideContainer.$message.error("还款金额不能大于未还金额!");
          }
          else {
            GMS.$hideContainer.$message.error("操作异常请联系管理员");
          }
        }
      }.bind(this));
    } else {
      this.approval(bill, param);
    }
  },
  approval: function (bill, param) {
    let taskId = bill.getGlobalParam('reviewParam').taskId;
    let comments = bill.getGlobalParam('reviewParam').suggestions ? bill.getGlobalParam('reviewParam').suggestions : "";
    GMS.$http.post('/rbc/workflow/approve/completed/' + taskId + '?result=1&comments=' + comments).then(
      function (response) {
        if (response.status == 200 || response.statusText == 'OK') {
          if (response.data.code != 0) {
            GMS.$hideContainer.$Message.error(response.data.message)
            return
          }
          bill.setControlsSate(param["_control_name_"], "enable", true)
          bill.setControlsSate(param["_control_name_"], "loading", false)
          GMS.$hideContainer.$Message.success('审批成功!')
          GMS.vbus.$emit('change-form-state', { state: 'readOnly'})
          
          if (
            window.osConfig.appOpenMode &&
            window.osConfig.appOpenMode == "apploader"
          ) {
            GMS.$hideContainer.$portalAPI.emit('entry-tag-close')
          }
          else if (Bridge.vm) {
            Bridge.vm.modal_visible = false
          }
          window.GMS.vbus.$emit('refresh-workflow-job-view')
        }
      }.bind(this)
    )
      .catch(
        function (error) {
          bill.setControlsSate(param["_control_name_"], "enable", true)
          bill.setControlsSate(param["_control_name_"], "loading", false)
          GMS.$hideContainer.$Message.error('工作流配置错误,请联系管理员')
        }.bind(this)
      );
  },
  isApproverEqulloginer: function (bill, param) {
    const loginer = GMS.userContext && GMS.userContext.id
    let approver = []
    $.ajax({
			type: "GET",
			url: `${osConfig.baseUrl}/rbc/workflow/confirmApprover/getUserId/${bill.getGlobalParam('reviewParam').taskId}`,
			async: false,
			contentType: "application/json;",
			beforeSend: function (request) {
				request.setRequestHeader("Authorization", GMS.util.getAuthorization());
			},
			success: function (data1) {
        approver = data1.ownerIds
			},
			error: function () {
			}
		})
    return approver.includes(loginer)
  }
}