import React, { useEffect, useRef, useState, useReducer } from "react";
import { Card, Modal, Button, Divider, message, Form } from "antd";
import { useRequest } from "umi";
import AutoTable from "@/components/AutoTable";
import getPrem from "@/utils/getPrem"; //权限判断fn
import defaultFields from "./fields";
import { doFetch } from "@/utils/doFetch";
import { bmNoTypeAll, bmNoType } from "@/services/platform";
import DrawInitForm from "@/components/DrawInitForm";

const initState = {
  vs: false,
  fields: {},
  iftype: {},
  curitem: {},
  bmNoTypeData: [],
};
function reducer(state, action) {
  let { type } = action,
    newState = {};
  switch (type) {
    case "add":
      newState = {
        ...state,
        vs: true,
        iftype: {
          title: "新增编号规则",
          val: type,
        },
        fields: { ...action.fields },
      };
      break;
    case "edit":
      newState = {
        ...state,
        vs: true,
        iftype: {
          title: "修改编号规则",
          val: type,
        },
        fields: { ...action.fields },
        curitem: action.curitem,
      };
      break;
    case "changeFields":
      newState = {
        ...state,
        fields: action.fields,
      };
      break;
    case "changeBmNoType":
      newState = {
        ...state,
        bmNoTypeData: action.bmNoTypeData,
      };
      break;
    case "close":
      newState = {
        ...state,
        vs: false,
        fields: {},
        iftype: {},
        curitem: {},
      };
      break;
  }

  return newState;
}
let Rule = (props) => {
  let actionRef = useRef(),
    [formRef] = Form.useForm();
  function reload() {
    actionRef?.current?.reload();
  }
  const { run, loading } = useRequest(doFetch, {
      manual: true,
      formatResult: (res) => res,
      onSuccess: (result, params) => {
        if (result.code == "0000") {
          reload();
          dispatch({ type: "close" });
        }
      },
    }),
    [state, dispatch] = useReducer(reducer, initState),
    { vs, fields, iftype, curitem, bmNoTypeData } = state,
    columns = [
      {
        title: "编号大类",
        dataIndex: "noTypeName",
        key: "noTypeName",
      },
      {
        title: "编号子类",
        dataIndex: "noSunName",
        key: "noSunName",
      },
      {
        title: "预览",
        dataIndex: "ruleNames",
        key: "ruleNames",
        search: false,
      },
      {
        title: "操作",
        valueType: "option",
        dataIndex: "option_dataindex",
        key: "option_dataindex",
        width: 135,
        render: (text, row, _, action) => extraAction(text, row, _, action),
      },
    ];

  useEffect(() => {
    doFetch({ url: "/ngic-base-business/bmNoType/querySelectAll" }).then(
      (res) => {
        if (res.code == "0000") {
          let dataList = res?.data?.dataList ?? [];
          dispatch({ type: "changeBmNoType", bmNoTypeData: dataList });
        }
      }
    );
  }, [props.route]);

  function extraAction(text, record, _, action) {
    return [
      getPrem("bmNumberRule_save", action, "修改", () => {
        doFetch({
          url: "/ngic-base-business/bmMainNumberRule/queryDetails",
          params: { id: record.id },
        }).then((res) => {
          let row = res?.data?.data;
          for (let i in defaultFields) {
            defaultFields[i].value = row[i];
            if (i == "noTypeId") {
              defaultFields[i].disabled = true;
              defaultFields[i].options.database = bmNoTypeAll;
            }
            if (i == "nrList") {
              let reshow = {
                value: row[i].filter(
                  (it) => it.noRuleCode != "increasing_order"
                ),
                other:
                  row[i].filter(
                    (it) => it.noRuleCode == "increasing_order"
                  )[0] || {},
              };
              reshow.other.increaseList = reshow.other.increaseList.map(
                (it) => {
                  return reshow.value.filter((item) => item.sort == it)[0].id;
                }
              );
              reshow.other.sort =
                reshow.other.sort == 1
                  ? reshow.other.sort
                  : reshow.other.sort - 1;

              defaultFields[i].value = reshow;
              defaultFields[i].extraparams = { noTypeId: record.noTypeId };
            }
            if (i == "noSunName") {
              let filterData = bmNoTypeData.filter(
                (it) => it.value == row["noTypeId"]
              );
              if (filterData.length > 0) {
                defaultFields[i].hides =
                  filterData[0].isSun == 1 ? false : true;
              } else {
                defaultFields[i].hides = false;
              }
            }
          }
          dispatch({ type: "edit", fields: defaultFields, curitem: row });
        });
      }),
      getPrem("bmNumberRule_deleteByNoTypeId", action, "删除", null, {
        title: "确认删除该编号规则？",
        onConfirm: () => {
          run({
            url: "/ngic-base-business/bmMainNumberRule/deleteById",
            params: { id: record.id },
          });
        },
      }),
    ];
  }

  let saveData = (values, fn) => {
    let newvalues = JSON.parse(JSON.stringify(values));
    let nrList = newvalues.nrList;
    let submitnolist = nrList.value,
      other = nrList.other;

    if (other.sort) {
      submitnolist.splice(other.sort, 0, other);
    } else {
      submitnolist.push(other);
    }

    submitnolist = submitnolist.map((it, i) => {
      return {
        ...it,
        sort: i + 1,
      };
    });

    submitnolist = submitnolist.map((it, i) => {
      if (it.noRuleCode == "increasing_order") {
        it.increaseList = it.increaseList.map((item) => {
          return submitnolist.filter((itemz) => itemz.id == item)[0].sort;
        });
      }
      return {
        ...it,
      };
    });

    let newfields = {
      ...newvalues,
      nrList: submitnolist,
    };

    let difrid = iftype.val == "edit" ? { id: curitem.id } : {};
    run({
      url: "/ngic-base-business/bmMainNumberRule/save",
      params: { ...newfields, ...difrid },
    });
  };

  let extra = (
    <Button
      disabled={!getPrem("bmNumberRule_save", "ifs")}
      type="primary"
      onClick={() => {
        for (let i in defaultFields) {
          defaultFields[i].value = null;
          defaultFields[i].disabled = false;
          if (i == "nrList") {
            defaultFields[i].extraparams = { noTypeId: "" };
          }
          if (i == "noTypeId") {
            defaultFields[i].options = {
              database: bmNoType,
              params: {},
            };
          }
        }
        dispatch({ type: "add", fields: defaultFields });
      }}
    >
      新增
    </Button>
  );
  return (
    <div>
      <AutoTable
        columns={columns}
        actionRef={actionRef}
        pagetitle={props.route.name}
        pageextra={extra}
        refreshDep={[bmNoTypeData]}
        path="/ngic-base-business/bmMainNumberRule/queryList"
      ></AutoTable>

      <DrawInitForm
        title={iftype.title}
        visible={vs}
        onClose={() => dispatch({ type: "close" })}
        footer={false}
        destroyOnClose={true}
        fields={fields}
        submitData={(values) => {
          saveData(values);
        }}
        onChange={(changedValues, allValues) => {
          //联动操作
          for (let i in changedValues) {
            if (i == "noTypeId") {
              for (let j in fields) {
                if (j == "nrList") {
                  fields[j].extraparams = { noTypeId: changedValues[i] };
                  fields[j].value = {
                    value: allValues.nrList?.value.map((it) => ({
                      ...it,
                      noRuleCode: "",
                    })),
                    other: {
                      ...allValues.nrList?.other,
                      noRuleCode: "",
                    },
                  };
                }
                if (j == "noSunName") {
                  let filterData = bmNoTypeData.filter(
                    (it) => it.value == changedValues[i]
                  );
                  if (filterData.length > 0) {
                    defaultFields[j].hides =
                      filterData[0].isSun == 1 ? false : true;
                  } else {
                    fields[j].hides = false;
                  }
                }
              }
              formRef.setFieldsValue({ nrList: fields["nrList"].value });
              dispatch({ type: "changeFields", fields });
            }
          }
        }}
        submitting={loading || !vs}
        width={"100%"}
        formRef={formRef}
      ></DrawInitForm>
    </div>
  );
};

export default Rule;
