import {
  login,
  logout,
  userinfo,
  menuList,
  dingdingdetail,
  usergetinfo,
  roleProcessInfo,
} from "@/apis/user";
import {
  getToken,
  setToken,
  removeToken,
  getMenu,
  setMenu,
  removeMenu,
  getBtn,
  setBtn,
  removeBtn,
  get_business_company,
  set_business_company,
  remove_business_company,
  get_business_companyNo,
  set_business_companyNo,
  remove_business_companyNo,
  get_private_field,
  set_private_field,
  remove_private_field,
  get_action_data,
  set_action_data,
  remove_action_data,
} from "@/utils/auth";
import store from "..";
const state = {
  token: getToken(),
  name: "",
  avatar: require("@/assets/img/avatar.gif"),
  introduction: "",
  roles: ["admin"],
  btnList: getBtn(),
  navList: getMenu(),
  business_company: get_business_company() || "",
  business_companyNo: get_business_companyNo() || "",
  private_field: get_private_field() || [],
  roleProcess: get_action_data() || [],
};
const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
  SET_MENU: (state, menu) => {
    state.menu = menu;
  },
  SET_HAS: (state, has) => {
    state.has = has;
  },
  SET_INTRODUCTION: (state, introduction) => {
    state.introduction = introduction;
  },
  SET_NAME: (state, name) => {
    state.name = name;
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar;
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles;
  },
  // mainListFn(state, val) {
  //   if (!val) {
  //     val = [];
  //   }
  //   state.mainList = val;
  //   setMainList(val)
  // },
  navListFn(state, val) {
    if (!val) {
      val = [];
    }
    state.navList = val;
    setMenu(val);
  },
  btnListFn(state, val) {
    if (!val) {
      val = [];
    }
    state.btnList = val;
    setBtn(val);
  },
  business_company(state, val) {
    state.business_company = val;
    set_business_company(val);
  },
  business_companyNo(state, val) {
    state.business_companyNo = val;
    set_business_companyNo(val);
  },
  roleProcess(state, val) {
    state.roleProcess = val;
    set_action_data(val);
  },
  private_field(state, val) {
    state.private_field = val;
    set_private_field(val);
  },
};

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo;
    return new Promise((resolve, reject) => {
      login({ username: username.trim(), password: password })
        .then((response) => {
          const { data } = response;
          if (response.code === 0) {
            commit("SET_TOKEN", data.token);
            commit("SET_NAME", data.userinfo.nickname)
            setToken(data.token);
          }
          resolve(response);
        })
        .catch((error) => {
          reject(error);
        });
    });
  },

  dingUserInfor({ commit }, code) {
    return new Promise(async (resolve, reject) => {
      dingdingdetail(code)
        .then((response) => {
          const { data } = response;
          if (response.code === 0) {
            commit("SET_TOKEN", data.token);
            setToken(data.token);
            resolve("success");
          } else {
            resolve("error");
          }
        })
        .catch((error) => {
          reject(error);
        });
    });
  },
  async getMenuList({ commit, that }) {
    return new Promise(async (resolve, reject) => {
      if (!getToken()) {
        resolve("noToken");
      } else {
        const { ucode, udata, umsg } = await getUserInfo();

        if (ucode >= 100 && ucode <= 104) {
          resolve("noToken");
        } else if (ucode !== 0) {
          resolve({ code: ucode, data: udata, massage: umsg });
        } else {
          const { business, private_field, roleid } = udata;
          let business_company = "",
            business_companyNo = "";
          if (business && business.length > 0) {
            business.forEach((e) => {
              if (e.is_main === "1") {
                business_company = e.company;
                business_companyNo = e.companyNo;
              }
            });
          }
          // 保存默认业务公司名称
          commit("business_company", business_company);
          // 保存默认业务公司编号
          commit("business_companyNo", business_companyNo);
          // 关键字段设置
          commit("private_field", private_field === "" ? [] : private_field);
          const { pcode, pdata, pmsg } = await getRoleProcess(roleid);
          if (pcode >= 100 && pcode <= 104) {
            resolve("noToken");
          } else if (pcode !== 0) {
            resolve({ code: pcode, data: {}, massage: pmsg });
          } else {
            // 保存默认业务公司编号
            commit("roleProcess", pdata ?? []);
            const { mcode, mdata, mmsg } = await getRoleMenuList();
            if (mcode >= 100 && mcode <= 104) {
              resolve("noToken");
            } else if (mcode !== 0) {
              resolve({ code: mcodd, data: {}, massage: mmsg });
            } else {
              const { arrag, isok, btnList } = mdata;

              // 生成页面权限
              commit("navListFn", arrag);
              // 生成按钮权限
              commit("btnListFn", btnList);
              // 生成路由
              initRouter(arrag, that);
              // state.commit("loginInfoCommit", res.data);
              resolve(isok ? "success-dataV" : "success");
            }
          }
        }
      }
    });
  },

  // user logout
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      commit("SET_TOKEN", "");
      commit("SET_ROLES", []);
      removeToken();
      commit("SET_MENU", "");
      commit("SET_HAS", "");

      removeMenu();
      removeBtn();
      remove_business_company();
      commit("business_company", "");
      commit("business_companyNo", "");
      remove_business_companyNo();
      remove_private_field();
      commit("private_field", []);
      remove_action_data();
      commit("action_data", []);
      // removeMainList()
      // reset visited views and cached views
      // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
      dispatch("tagsView/delAllViews", null, { root: true });
      resolve();
    });
  },

  // remove token
  resetToken({ commit }) {
    return new Promise((resolve) => {
      commit("SET_TOKEN", "");
      commit("SET_ROLES", []);
      removeToken();
      resolve();
    });
  },
};
async function getUserInfo() {
  const { code, data, meaasge } = await usergetinfo({});
  return {
    ucode: code,
    udata: data,
    umsg: meaasge,
  };
}

async function initalUserInfo(){
  const { data } = await usergetinfo({});
  console.log(data.nickname)
  store.commit('user/SET_NAME',data.nickname);
}

async function getRoleProcess(roleid) {
  const { code, data, meaasge } = await roleProcessInfo({ roleid });
  let list = data;
  list.map((si) => {
    si.action = [];
    if (si.child && si.child.length > 0) {
      si.child.map((sii) => {
        si.action.push(sii.order_process + "");
        return sii;
      });
    }

    return si;
  });
  return {
    pcode: code,
    pdata: list,
    pmsg: meaasge,
  };
}
async function getRoleMenuList() {
  const { code, data, meaasge } = await menuList({});
  let arrag = [];
  let btnList = [];
  let list = [];
  let isok = false;
  if (code === 0) {
    list = data ?? [];
    list = list.filter((item) => item.child && item.child.length > 0);
    list.forEach((v1) => {
      const { menu_route, child } = v1;
      if (menu_route === "bigScreen" && child.length) {
        isok = true;
      }
      let pItem = {
        name: v1.menu_route,
        path: `/${v1.menu_route}`,
        meta: {
          title: v1.menu_name,
          icon: v1.menu_img,
        },
        children: [],
      };
      v1.child.forEach((v2) => {
        let item = {
          path: v2.menu_route,
          name: v2.menu_route,
          hidden: parseInt(v2.is_display + "") === 0,
          meta: {
            title: v2.menu_name,
            icon: v2.menu_img,
          },
          url: v2.menu_url,
        };
        let model = {
          menu_route: v2.menu_route,
          action: v2.action,
        };
        btnList.push(model);
        pItem.children.push(item);
      });
      arrag.push(pItem);
    });
  }
  return {
    mcode: code,
    mdata: {
      isok,
      arrag,
      btnList,
    },
    mmsg: meaasge,
  };
}

function initRouter(arr) {
  const IndexRoute = [
    // 个人信息
    {
      path: "/person",
      component: () => import("@/layout/index"),
      redirect: "/person/my-message",
      hidden: true,
      alwaysShow: true,
      meta: {
        title: "个人中心",
        icon: "user",
      },
      children: [
        {
          path: "my-message",
          component: () => import("@/views/person-infor/my-message"),
          name: "MyMessage",
          alwaysShow: true,
          meta: { title: "我的信息", noCache: true, breadcrumb: true },
        },
        {
          path: "change-phone",
          component: () => import("@/views/person-infor/change-phone"),
          name: "ChangePhone",
          alwaysShow: true,
          meta: { title: "更换手机号", noCache: true, breadcrumb: true },
        },
        {
          path: "change-password",
          component: () => import("@/views/person-infor/change-password"),
          name: "ChangePassword",
          alwaysShow: true,
          meta: { title: "修改密码", noCache: true, breadcrumb: true },
        },
      ],
    },
    //欢迎页
    {
      path: "/welcome",
      component: () => import("@/layout/index"),
      redirect: "/welcome/dashboard",
      children: [
        {
          path: "dashboard",
          component: () => import("@/views/dashboard/index"),
          name: "Dashboard",
          meta: { title: "首页", icon: "dashboard", affix: true },
        },
      ],
    },
  ];

  arr.map((v1) => {
    v1.component = (resolve) => require([`@/layout/index.vue`], resolve);
    if (v1.children && v1.children.length > 0) {
      v1.redirect = `/${v1.name}/${v1.children[0].name}`;
      v1.children.map((v2) => {
        v2.component = (resolve) => require([`@/views/${v2.url}.vue`], resolve);
        return v2;
      });
    }
    return v1;
  });
  IndexRoute.push(...arr);
  IndexRoute.push({
    path: "404",
    component: () => import("@/views/error-page/404"),
    hidden: false,
    noCache: true,
  });

  IndexRoute.push({
    path: "*",
    redirect: "/404",
  });
  window.vm.$router.addRoutes(IndexRoute);
}

initalUserInfo();

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
