import router from "@/router";

import {
  login,
  menuList,
  dingdingdetail,
  usergetinfo,
  roleProcessInfo,
  requsetSupertubeCompany,
  requsetUserBindingCompany,
  reuqsetRoleInfo
} 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,
  get_role_level,
  getUserCompany,
  setUserCompany,
  removeUserCompany,
  setUserInfo as _setUserInfo,
  getUserInfo as _getUserInfo,
  removeUserInfo as _removeUserInfo,
  getCompanyType as _getCompanyType,
  setCompanyType as _setCompanyType,
  removeCompanyType as _removeCompanyType
} from '@/utils/auth'


import { MessageBox } from "element-ui";
import { convertCompanylist } from "@/utils";

export const userStoreActions = {
  reloadMenu: 'user/reloadMenulist',
  loginByToken: 'user/loginByToken',
  setCompanyList: 'user/setCompanylist',
  setCurrentLevel: 'user/setCurrentLevel',
  setCurrentCompany: 'user/setCurrentCompany'
}

const state = {
  token: getToken(),
  name: "",
  avatar: require("@/assets/img/avatar.gif"),
  introduction: "",
  roles: ["admin"],
  btnList: getBtn(),
  navList: getMenu(),
  role_level:get_role_level() || "1",
  business_company: get_business_company() || "",
  business_companyNo: get_business_companyNo() || "",
  private_field: get_private_field() || [],
  roleProcess: get_action_data() || [],
  currentCompany: getUserCompany() ? getUserCompany().code : '',
  userInfo: _getUserInfo(),
  isSupertube: false,
  companylist:[],
  originLevel: "0",
  currentLevel: "0"
};

const companyTypes = {
  'business': 'business',
  'supplier': 'supplier'
}

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;
  },
  navListFn(state, val) {
    if (!val) {
      val = [];
    }
    state.navList = val;
    setMenu(val);
  },
  btnListFn(state, val) {
    if (!val) {
      val = [];
    }
    state.btnList = val;
    setBtn(val);
  },

  setSupplier(state,val){
    state.isSupplier = 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);
  },

  setCurrentLevel(state, val){
    state.currentLevel = val
  },

  setOriginLevel(state, val){
    state.originLevel = val
  },

  setUserInfo(state, info){
    state.userInfo = info
    _setUserInfo(info)
  },

  setCurrentCompany(state, code){
    //获取当前公司详细信息
    const company = state.companylist.find(({code: _code}) => _code === code)
    setUserCompany(company)
    state.currentCompany = code;
  },

  setCompanyType(state, code){
    const isBusiness = code.indexOf('GS') >= 0
    state.companyType = isBusiness ? companyTypes.business : companyTypes.supplier
  },

  setCompanylist(state,val){
    state.companylist = val
  },
  setSupertube(state, val) {
    state.isSupertube = 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 {code, data } = response;
          if (code === 0) {
            const {token,nickname}=data
            commit("SET_TOKEN", token);
            commit("SET_NAME", nickname);
            setToken(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 loginByToken({commit, dispatch}, token) {
    setToken(token)
    await commit('SET_TOKEN')
    await dispatch('getMenuList')
  },
  async getRoleInfo({commit, that, dispatch}, _current_company_){
    return new Promise(async resolve => {
      //查找默认的业务公司 设置到全局的currentCompany
      const { roleid } = _current_company_;

      //根据角色获取流程节点权限
      const { pcode, pdata, pmsg } = await getRoleProcess(roleid);
      if (pcode === 0) {
        commit("roleProcess", pdata ?? []);
      }
      if (pcode >= 100 && pcode <= 104) {
        resolve("noToken");
        return
      }
      //根据角色获取角色详情 获取关键字字段
      const {code: rcode, data: rdata, message: rmsg} = await reuqsetRoleInfo({ roleid: roleid })

      if(rcode === 0){
        commit("private_field", rdata.private_field ? rdata.private_field.split(',') : []);
      }

      if (rcode >= 100 && rcode <= 104) {
        resolve("noToken");
        return
      }
    })
  },

  async getMenuList({ commit, that, dispatch }) {
    return new Promise(async (resolve) => {
      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 { level } = udata;
          //是否超管
          const isSupertube = level === '1'
          //是否供应商
          const isSupplier = level === '3'
          //保存用户信息
          commit('setUserInfo', udata)
          //保存是否超管
          commit('setSupplier', isSupplier)
          //保存是否超管用户
          commit("setSupertube", isSupertube);
          //设置原始level和当前level
          commit('setOriginLevel', level)
          commit('setCurrentLevel', level)
          //获取公司列表(区分超管和普通账户api)
          const api = isSupertube ? requsetSupertubeCompany : requsetUserBindingCompany
          //获取缓存里的业务公司 => 公司名称搜索 => 存在设置为默认公司
          const { data: companyData, code: companyCode } = await api({
            ...(!isSupertube ? ({size: 10000}) : {type: '1'}),
            ...({token: getToken()}),
          })
           //保存公司列表 普通用户和超管使用两个列表需要转换
           let _companylist = []
           if(companyCode === 0) {
            _companylist = isSupertube ? companyData.list : convertCompanylist(companyData.list);
            //超管 + 业务公司 需要将 relation_code 设置为 code
            // if(isSupertube) _companylist = _companylist.map(item => ({...item, code: item.relation_code}))
            commit('setCompanylist', _companylist)
           }
           if(companyCode >= 100 && companyCode <= 104){
             resolve("noToken")
             return
           }

          //非超管用户获取保存 流程权限 & 关键字字段 & 设置默认业务公司
          let defaultCompany = ''
          if(!isSupertube){
            //查找默认的业务公司 设置到全局的currentCompany
            defaultCompany =  _companylist.find(({is_main}) => is_main === '1');
            const result = dispatch('getRoleInfo', defaultCompany)
            if(result === 'noToken') {
              resolve('noToken')
              return
            }
          }

          //保存默认公司
          commit('setCurrentCompany', defaultCompany ? defaultCompany.code : '')
          const { mcode, mdata, mmsg } = await getRoleMenuList();

          //拦截账号异常: 禁用
          if(mcode === 10001) {
            dispatch('disabledCompany');
            return
          }

          if (mcode >= 100 && mcode <= 104) {
            resolve("noToken");
          } else if (mcode !== 0) {
            resolve({ code: mcode, data: {}, massage: mmsg });
          } else {
            const { arrag, isok, btnList } = mdata;
            // 生成页面权限
            commit("navListFn", arrag);
            // 生成按钮权限
            commit("btnListFn", btnList);
            // 生成路由
            initRouter(arrag, that);
            resolve(isok ? "success-dataV" : "success");
          }
        }
      }
    });
  },

  // user logout
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      commit("SET_TOKEN", "");
      commit("SET_ROLES", []);
      commit("SET_MENU", "");
      commit("SET_HAS", "");
      _removeUserInfo()
      removeBtn();
      removeMenu();
      removeToken();
      remove_business_company();
      commit("business_company", "");
      commit("business_companyNo", "");
      remove_business_companyNo();
      remove_private_field();
      commit("private_field", []);
      remove_action_data();
      commit("action_data", []);
      removeUserCompany()
      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({
    token:getToken()
  });

  return {
    ucode: code,
    udata: data,
    umsg: meaasge,
  };
}

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,
  };
}

// function isHasRoute(routes){
//   let isHas = false
//   const chunks = location.hash.split('/')
//   const currentPath = chunks[chunks.length - 1]

//   const dfs = (routes) => {
//     routes.forEach(route => {
//       if(route.path === currentPath) isHas = true;
//       if(route.children && route.children.length > 0) dfs(route.children)
//     })
//   }

//   dfs([
//   {
//     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:'/reload',
//         component:() => import('@/views/reload/index')
//       }
//     ],
//   },
//   //欢迎页
//   {
//     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 },
//       },
//     ],
//   },...routes])
//   return isHas
// }

// 区分供应商和业务公司获取不同的菜单列表
async function getRoleMenuList(level = "") {
  const { code, data, message } = await menuList({
    ...(level && level !== '1' ? { level } : {})
  })

  //menu接受账户异常:禁用 并返回
  if(message === '账户已禁用' || message === '没有该公司的默认角色'){
    return {
      mdata: {},
      mmsg: '账号被禁用',
      mcode: 10001
    }
  }

  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_private + "") === 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);
    });
  }

  // const isHas = isHasRoute(arrag)
  // if(!isHas) router.push('/welcome/dashboard')

  return {
    mcode: code,
    mdata: {
      isok,
      arrag,
      btnList,
    },
    mmsg: message,
  };
}

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:'/reload',
          component:() => import('@/views/reload/index')
        }
      ],
    },
    //欢迎页
    {
      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: "/welcome/dashboard",
  })

  window.vm.$router.addRoutes(IndexRoute);
}

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