/**
 * 审核按钮封装
 * 徐立
 * 2020-3-28
 * data 为 'affair/getIdFormDetail' 接口请求到的数据
 * callback 提交完成后执行回调函数
 * form form表单控件
 */
import React, { useState } from "react";
import { Modal, message } from "antd";
import { preHandle } from "@/webPublic/one_stop_public/utils/myutils";
import { connect } from "dva";
import Btn from "./pagesBtn";
import styles from "./styles.less";
import ModalDiy from "@/baseComponent/ModalDiy";
import { callbackSubmitData } from "@/webPublic/one_stop_public/models/callbackExamineProcess";
import { getToken } from "@/utils/authority";
import { isJSON } from "@/webPublic/zyd_public/utils/utils";
import { uaaRequest } from "@/webPublic/one_stop_public/utils/request";

function AuditButton(props) {
  const [visible, setVisible] = useState(false);
  const [modalContent, setModalContent] = useState("");
  const [isSubmitLoading, setSubmitLoading] = useState(false);
  const [affairOkParams, setAffairParams] = useState({});

  function affairOk() {
    // 有taskIds属性时，是批量审核，
    const { dispatch, callback, data, form, taskIds, selectRows } = props;
    const { oldKey, btnValue } = affairOkParams;
    if (window.stuSigningAuditXueShengChu && btnValue === "0") {
      // 黔南就业学生处批量审批签章 特殊处理 专门为黔南签章批量审核搞的函数
      // 应该是点击同意才执行这个全局函数.
      window.stuSigningAuditXueShengChu({
        userNowInfo: (isJSON(localStorage.getItem("user")) && JSON.parse(localStorage.getItem("user"))) || {},
        buttonInfo: data?.btns && data?.btns.length ? data?.btns.find((x) => x.value === btnValue) : {},
        token: getToken(),
        selectRows,
        taskIds: taskIds || [data.taskId], // 接口里面的taskId 任务Id
        examineMap: JSON.stringify({
          [oldKey]: btnValue, // 每个配置按钮对应的对象内容 oldkey = 接口中 key btnValue = 接口中 value
          // reason: value, // 审批理由
          code: taskIds ? undefined : data.code,
          reason: form.getFieldsValue()?.reason
        }),
        code: taskIds ? undefined : data.code,
        message,
        Modal,
        uaaRequest,
        callback,
        setVisible,
        setSubmitLoading,
        remark: {
          setVisible: "关闭弹窗的方法",
          setSubmitLoading: "显示为加载中",
          path: " 代码在学工的这里面 src/webPublic/FormInsertDiy/AuditButton/index.js",
          message: "蚂蚁金服的message 用来展示进度条.  不懂问我",
          Modal: "蚂蚁金服的Modal  用来提示审核已完成",
          callback: "执行完了的回调函数",
          else: "其他参数打印出来自己看看",
          uaaRequest: "调一站式的接口的方法"
        }
      });
      return true;
    }

    let buttonInfo = data?.btns && data?.btns.length ? data?.btns.find((x) => x.value === btnValue) : {};
    const submitValues = (values) => {
      setSubmitLoading(true);
      preHandle(values);
      let payload = {
        taskIds: taskIds || [data.taskId], // 接口里面的taskId 任务Id
        code: taskIds ? undefined : data.code,
        // 审核相关内容
        examineMap: JSON.stringify({
          [oldKey]: btnValue, // 每个配置按钮对应的对象内容 oldkey = 接口中 key btnValue = 接口中 value
          // reason: value, // 审批理由
          code: taskIds ? undefined : data.code
        }),
        taskForm: JSON.stringify(values), // 审批表单的参数值
        apiData: data,
        taskFormKey: data?.taskFormKey,
        userNowInfo:
          (isJSON(localStorage.getItem("user")) && JSON.parse(localStorage.getItem("user"))) || {},
        buttonInfo,
        token: getToken()
      };
      payload = callbackSubmitData(payload);
      dispatch({
        type: "affair/getExamineProcess",
        payload,
        callback: (val) => {
          setSubmitLoading(false);
          setVisible(false);
          if (callback) {
            callback(val);
          }
        }
      });
    };
    // console.log(buttonInfo);
    if (buttonInfo?.isValidateForm === false) {
      submitValues(form.getFieldsValue());
    } else {
      form.validateFieldsAndScroll((err, values) => {
        if (err) return;
        submitValues(values);
      });
    }

  }

  function hideModal() {
    setVisible(false);
  }

  /**
   * 根据不同值,返回对应样式
   */
  function getStyle(key, value) {
    if (key === "examine") {
      switch (value) {
        case 1:
          return [`${styles.btn_margin}`, `${styles.btn}`, `${styles.btn_reject}`].join(" ");
        case 2:
          return [`${styles.btn_margin}`, `${styles.btn}`, `${styles.btn_no}`].join(" ");
        case 0:
          return "deafalut";
        case "1":
          return [`${styles.btn_margin}`, `${styles.btn}`, `${styles.btn_reject}`].join(" ");
        case "2":
          return [`${styles.btn_margin}`, `${styles.btn}`, `${styles.btn_no}`].join(" ");
        case "0":
          return "deafalut";
        default:
          return "deafalut";
      }
    } else {
      return "deafalut";
    }
  }

  function showModal(str, key, value) {
    const { data, form } = props;
    const buttonInfo = data?.btns && data?.btns.length ? data?.btns.find((x) => x.value === value) : {};
    const values = form.getFieldsValue();
    if(buttonInfo?.documentation){
      let needAuditInfo = isJSON(buttonInfo.documentation) && JSON.parse(buttonInfo.documentation)?.needAuditInfo;
      if(needAuditInfo && !values.reason){
        message.warning('请输入审批理由');
        return ;
      }
    }
    setModalContent(`确定${str}吗？`);
    setAffairParams({ oldKey: key, btnValue: value });
    setVisible(true);
  }

  const {
    data: { isHandle, btns }
  } = props;
  if (!isHandle || !Array.isArray(btns) || btns.length < 1) return null;
  return (
    <>
      <div className={styles.btn_page}>
        {btns.map((item) => (
          <Btn
            get="8"
            key={item.value}
            btnOne={() => {
              showModal(item.name, item.key, item.value);
            }}
            text={item.name}
            style={getStyle(item.key, item.value)}
          />
        ))}
      </div>
      <ModalDiy
        visible={visible}
        title="提示"
        handleCancel={hideModal}
        handleOk={affairOk}
        confirmLoading={isSubmitLoading}>
        <div style={{ fontSize: 16, textAlign: "center", height: 150, lineHeight: "150px" }}>
          {modalContent}
        </div>
      </ModalDiy>
    </>
  );
}

export default connect()(AuditButton);
