import React, { useState, useRef, useReducer } from "react";
import { Button, Tooltip, Row, Divider, Drawer, Form, message } from "antd";
import AutoTable from "@/components/AutoTable";
import getPrem from "@/utils/getPrem"; //权限判断fn
import { useRequest } from "umi";
import defaultFields from "./fields";
import { doFetch } from "@/utils/doFetch";
import Details from "@/components/Details";
import { materielDetail } from "@/utils/detailTotalCard";
import InitForm from "@/components/InitForm";
import moment from "moment";
import TreeRender from "@/components/TreeRender";
import { useEffect } from "react";
import { storeselectionBoxAll } from "@/services/system.js";

const initState = {
    vs: false,
    fields: {},
    iftype: {},
    curitem: {},
    detail: {
      dataSource: {},
      totalCard: [],
    },
    visible: false,
    specificFileds: {},
    commonFields: {},
    defaultCommonFields: [],
  },
  otherBasic = {
    materieCode: "物料编号",
    materieName: "物料名称",
    materieTypeName: "物料类型",
    productionUnitName: "生产单位(主)",
    processLineName: "工艺路线",
  };
function reducer(state, action) {
  let { type } = action,
    newState = {};
  switch (type) {
    case "add":
      newState = {
        ...state,
        vs: true,
        iftype: {
          title: "新增仓位",
          val: type,
        },
        fields: { ...action.fields },
        commonFields: action.commonFields,
        specificFileds: action.specificFileds,
      };
      break;
    case "edit":
      newState = {
        ...state,
        vs: true,
        iftype: {
          title: "编辑库位",
          val: type,
        },
        fields: { ...action.fields },
        curitem: action.curitem,
        commonFields: action.commonFields,
        specificFileds: action.specificFileds,
        defaultCommonFields: action.defaultCommonFields,
      };
      break;
    case "bom":
      newState = {
        ...state,
        vs: true,
        iftype: {
          title: "编辑物料BOM",
          val: type,
        },
        fields: { ...action.fields },
        curitem: action.curitem,
        markKey: action.markKey,
      };
      break;
    case "see":
      newState = {
        ...state,
        detail: {
          dataSource: action.dataSource,
          totalCard: action.totalCard,
        },
        visible: true,
      };
      break;
    case "changeSpecificFileds":
      newState = {
        ...state,
        specificFileds: action.specificFileds,
      };
      break;
    case "changeFields":
      newState = {
        ...state,
        fields: action.fields,
      };
      break;
    case "changeCommonFields":
      newState = {
        ...state,
        commonFields: action.commonFields,
      };
      break;
    case "changeDefaultCommonFields":
      newState = {
        ...state,
        defaultCommonFields: action.defaultCommonFields,
      };
      break;
    case "close":
      newState = {
        vs: false,
        fields: {},
        iftype: {},
        curitem: {},
        detail: {
          dataSource: {},
          totalCard: [],
        },
        visible: false,
        specificFileds: {},
      };
      break;
  }

  return newState;
}

const Materiel = (props) => {
  let actionRef = useRef(),
    ChildRef = null,
    [formRef] = Form.useForm(),
    [formRefs] = Form.useForm();
  const [materieTypeId, setmaterieTypeId] = useState();
  const [defaultSpecificFileds, setdefaultSpecificFileds] = useState();
  function reload() {
    actionRef?.current?.reload();
    ChildRef?.onRefresh();
  }
  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,
      detail,
      visible,
      specificFileds,
      commonFields,
      defaultCommonFields,
      markKey,
    } = state,
    columns = [
      {
        title: "库位编码",
        dataIndex: "storePositionCode",
        key: "storePositionCode",
      },
      {
        title: "库位名称",
        dataIndex: "storePositionName",
        key: "storePositionName",
        // render: (_, row) => {
        //   return (
        //     <Tooltip title={row.materieName}>
        //       <a
        //         className="table-cell"
        //         onClick={() => {
        //           doFetch({
        //             url: "/ngic-workmanship/pmMaterie/queryDetailById",
        //             params: { id: row.id },
        //           }).then((res) => {
        //             if (res.code == "0000") {
        //               let dataSource = res?.data?.data ?? {},
        //                 specials = res?.data?.data?.materieCharList ?? [];
        //               let newData = formatFieds(specials, "special")?.data;

        //               let newSpecialData = newData.map((it) => {
        //                 dataSource[it.fieldsKey] = it.fieldRealValue;
        //                 return {
        //                   title: it.fieldName,
        //                   key: it.fieldsKey,
        //                 };
        //               });
        //               let itemCol = [
        //                 {
        //                   cardTitle: "特殊属性",
        //                   itemData: newSpecialData,
        //                 },
        //               ];
        //               dataSource.newqualityGuaranteePeriod =
        //                 dataSource.qualityGuaranteePeriod == 0 ||
        //                 dataSource.qualityGuaranteePeriod
        //                   ? dataSource.qualityGuaranteePeriod +
        //                     dataSource.qualityGuaranteePeriodUnitName
        //                   : null;
        //               let totalCard = materielDetail.concat(itemCol);
        //               dispatch({ type: "see", dataSource, totalCard });
        //             }
        //           });
        //         }}
        //       >
        //         {row.materieName}
        //       </a>
        //     </Tooltip>
        //   );
        // },
      },
      {
        title: "所属仓库",
        dataIndex: "storeName",
        key: "storeName",
        // valueType: "select",
        // options: {
        //   database: storeselectionBoxAll,
        // },
      },
      {
        title: "所属库区",
        dataIndex: "storeAreaName",
        key: "storeAreaName",
        // options: {
        //   database: () =>
        //     doFetch({
        //       url: "/ngic-base-business/sysDic/queryMaterieControlSelect",
        //     }),
        //   params: {},
        // },
        // valueType: "select",
        // formItemProps: {
        //   name: "materieControl",
        // },
      },
      {
        title: "排",
        dataIndex: "row",
        key: "row",
        valueType: "digit",
        search: false,
      },
      {
        title: "列",
        dataIndex: "line",
        key: "line",
        valueType: "digit",
        search: false,
      },
      {
        title: "层",
        dataIndex: "level",
        key: "level",
        valueType: "digit",
        search: false,
      },
      {
        title: "状态",
        dataIndex: "status",
        key: "status",
        search:false,
        render: (_, row) => <span>{row?.status == "1" ? "启用" : "禁用"}</span>,
      },
      {
        title: "更新人",
        dataIndex: "updateUserName",
        key: "updateUserName",
        search: false,
      },

      {
        title: "更新时间",
        dataIndex: "updateTime",
        key: "updateTime",
        search: false,
      },
      {
        title: "是否为移库仓位",
        dataIndex: "isMovePosition",
        key: "isMovePosition",
        valueType: "select",
        search: false,
        options: [
          {
            value: "1",
            label: "是",
          },
          {
            value: "2",
            label: "否",
          },
        ],
        render: (_, row) => {
          return row?.isMovePosition ? "是" : "否";
        },
      },

      {
        title: "操作",
        dataIndex: "option_dataindex",
        key: "option_dataindex",
        valueType: "option",
        width: 160,
        render: (text, row, _, action) => extraAction(text, row, _, action),
      },
    ];
  useEffect(() => {
    doFetch({
      url: "/ngic-workmanship/pmMaterieChar/queryCommonList",
      params: {},
    }).then((res) => {
      setdefaultSpecificFileds(res?.data?.dataList);
    });
  }, []);

  function extraAction(text, record, _, action) {
    return [
      getPrem("sysDepartment_save", action, "修改", () => {
        doFetch({
          url: "/ngic-auth/sysStorePosition/queryById",
          params: { id: record.id },
        }).then((res) => {
          if (res.code == "0000") {
            let data = res?.data?.data ?? {};
            console.log(data);
            let newArr =
              data?.materieProductUnitList?.map((it) => {
                return {
                  productionUnit: it.productionUnit,
                  productionUnitType: it.productionUnitType,
                  id: it.id,
                };
              }) ?? [];

            for (let i in defaultFields) {
              defaultFields[i].value = data[i];
              // if (i == "unitList") {
              //   defaultFields[i].value = [
              //     {
              //       id: moment().valueOf(),
              //       productionUnit: data?.productionUnit,
              //       productionUnitType: data?.productionUnitType,
              //     },
              //     ...newArr,
              //   ];
              // }
            }
            console.log(defaultFields);
            let all = async () => {
              let common = await doFetch({
                url: "/ngic-workmanship/pmMaterieChar/queryCommonList",
                params: { id: record.id },
              });

              return {
                commonData: common?.data?.dataList,
              };
            };
            all().then((res) => {
              let commonDataFields = formatFieds(
                  res?.commonData,
                  "common"
                )?.obj,
                newCommonData = formatFieds(res?.commonData, "common")?.data;
              console.log(defaultFields);
              dispatch({
                type: "edit",
                fields: defaultFields,
                curitem: record,
                commonFields: commonDataFields,
                specificFileds: { ...commonDataFields },
                defaultCommonFields: newCommonData,
              });
              setdefaultSpecificFileds([...newCommonData]);
            });
          }
        });
      }),
      getPrem("sysDepartment_deleteById", action, "删除", null, {
        title: "确认删除该库位?",
        onConfirm: () => {
          run({
            url: "/ngic-auth/sysStorePosition/deleteById",
            params: { id: record.id },
          });
        },
      }),
    ];
  }
  let saveData = () => {
    //新增&修改
    let difrid = iftype.val != "add" ? { id: curitem.id } : {},
      params,
      url;
    if (iftype.val != "bom") {
      formRef
        .validateFields()
        .then((firstValues) => {
          formRefs
            .validateFields()
            .then((secondFields) => {
              let secondFieldsKeys = Object.keys(secondFields);
              let materieProductUnitList =
                firstValues?.materieProductUnitList?.map((it) => {
                  return {
                    productionUnit: it.productionUnit,
                    conversionRate: it.conversionRate,
                  };
                });
              for (let i in firstValues) {
                if (firstValues[i] === undefined) {
                  firstValues[i] = null;
                }
              }
              params = {
                ...firstValues,
                ...difrid,
                materieProductUnitList,
              };
              url = "/ngic-auth/sysStorePosition/save";
              run({ url, params });
            })
            .catch((error) => {});
        })
        .catch((error) => {});
    } else {
      url = "/ngic-workmanship/pmMaterie/saveMaterieBom";
      let firstValues = formRef?.getFieldsValue();
      let materieBomList = firstValues?.materieBomList?.map((it, i) => {
        return {
          materieId: it.id,
          materieName: it.materieName,
          materieCode: it.materieCode,
          materieType: it.materieType,
          numberUnits: it.numberUnits,
          workingProduceId: it.workingProduceId,
          workingFeedingId: it.workingFeedingId,
          rowKey: String(i),
          productionUnitName: it.productionUnitName,
        };
      });
      params = {
        materieBomList,
        ...difrid,
      };
      run({ url, params });
    }
  };
  let extrarender = [
    <Button
      disabled={!getPrem("sysDepartment_save", "ifs")}
      type="primary"
      onClick={() => {
        doFetch({
          url: "/ngic-workmanship/pmMaterieChar/queryCommonList",
          params: {},
        }).then((res) => {
          if (res.code == "0000") {
            let data = res?.data?.dataList,
              otherFields = formatFieds(data, "common")?.obj,
              newData = formatFieds(data, "common")?.data;
            for (let i in defaultFields) {
              defaultFields[i].value = null;
              defaultFields[i].disabled = false;
              if (i == 'status') {
                defaultFields[i].value = 1;
              }
              if (
                i == "serialNumberRuleId" ||
                i == "labelTemplateId" ||
                i == "processLineId"
              ) {
                defaultFields[i].required = false;
              }
              // if (i == "issueType") {
              //   defaultFields[i].value = 1;
              // }
            }
            dispatch({
              type: "add",
              fields: defaultFields,
              commonFields: otherFields,
              specificFileds: otherFields,
            });
            dispatch({
              type: "changeDefaultCommonFields",
              defaultCommonFields: newData,
            });
          }
        });
      }}
    >
      新增
    </Button>,
  ];
  function formatFieds(data, type) {
    let obj = {};
    for (let i = 0; i < data.length; i++) {
      let item = data[i],
        fieldsKey = type + "field" + i;
      item["fieldsKey"] = fieldsKey;
      if (item.fieldChar == 1) {
        obj[fieldsKey] = {
          value: item?.fieldRealValue ?? "",
          title: item.fieldName,
          name: [fieldsKey],
          required: false,
          type: "input",
        };
      } else {
        obj[fieldsKey] = {
          value:
            item?.fieldRealValue == 0 || item?.fieldRealValue
              ? item?.fieldRealValue
              : item.fieldChar == 4
              ? []
              : "",
          title: item.fieldName,
          name: [fieldsKey],
          required: false,
          type: item.fieldChar == 3 ? "radio" : "select",
          options: item.valueList,
          multiple: item.fieldChar == 4 ? true : false,
        };
      }
    }
    return {
      obj,
      data,
    };
  }
  useEffect(() => {
    console.log("123", materieTypeId);
  }, [materieTypeId]);
  return (
    <div>
      <AutoTable
        pagetitle={props.route.name} //页面标题
        pageextra={extrarender} //页面操作 新增or批量删除
        columns={columns}
        path="/ngic-auth/sysStorePosition/queryList"
        actionRef={actionRef}
        onRef={(node) => (ChildRef = node)}
        childposition="left"
        extraparams={{ ...materieTypeId }}
        x={600}
      >
        <div
          style={{
            width: 260,
            flexShrink: 0,
            marginTop: -4,
            borderRight: "1px solid #f0f0f0",
            paddingRight: 12,
            marginRight: 12,
          }}
        >
          <TreeRender
            url="/ngic-auth/sysFactory/queryFactoryStoreTree"
            // deleteurl="/ngic-auth/sysFactory/deleteById"
            // saveurl="/ngic-auth/sysFactory/save"
            onselected={(vals, e, alldata) => {
              console.log(e?.node);
              const valType = e?.node?.level;
              let obj = {};
              if (valType == 1) {
                // 工厂
                obj.factoryId = vals[0] ?? "";
              } else if (valType == 2) {
                obj.storeId = vals[0] ?? "";
              } else if (valType == 3) {
                obj.storeAreaId = vals[0] ?? "";
              }
              console.log(obj);
              setmaterieTypeId(obj);
            }}
          />
        </div>
      </AutoTable>
      <Drawer
        title={iftype.title}
        visible={vs}
        onClose={() => dispatch({ type: "close" })}
        footer={false}
        destroyOnClose={true}
        getContainer={false}
        style={{ position: "absolute" }}
        width={"100%"}
      >
        <InitForm
          formRef={formRef}
          fields={fields}
          onChange={(changedValues, allValues) => {}}
          actions={() => {
            return null;
          }}
        ></InitForm>
        <Button
          style={{ width: "100%" }}
          type="primary"
          size="large"
          loading={loading || !vs}
          onClick={() => saveData()}
        >
          提交
        </Button>
      </Drawer>
      <Details
        title="物料详情"
        visible={visible}
        onClose={() => dispatch({ type: "close" })}
        footer={false}
        destroyOnClose={true}
        width={"100%"}
        {...detail}
      ></Details>
    </div>
  );
};
export default Materiel;