import portal from "@/api/portal.js";
import process from "@/api/process.js";
const state = {
    all: [],            //菜单数据
    residual: false,    //手动修改了菜单的标记
    statement: [],      //报表中心菜单
    pagination: {},     //分页参数
    rows: [],           //新闻动态列表数据
    notice: [],         //发文公告列表数据
    total: 0,           //列表数据总条数
    filesData: {},      //新闻公告详情
    meeting: [],         //会议列表
    menuMaps: {},		//动态菜单数据
    currentMenu: {},     //当前一级菜单
    columnAliasAry: [],  //当前要请求栏目数据的别名数组
    columnQueryMerging: null, //获取栏目数据的请求合并标记变量
    columnData: {},       //各栏目的数据
    columnDataLoadedAliases: null,
    sysMenus: [],    //系统后台菜单
    frontMenus: [],      //前台菜单
}

const getters = {
    getColumnDataWithAlias: (state) => (alias) => {
        return state.columnData[alias];
    },
    hasColumnDataWithAlias: (state) => (alias) => {
        return state.columnData.hasOwnProperty(alias);
    },
    frontMenus: function (state) {
        return state.frontMenus;
    },
    sysMenus: function (state) {
        return state.sysMenus;
    },
    
}

const actions = {
    actionSysMenus({
        commit,
        state
    }) {
        return new Promise((resolve, reject) => {
          if (state.menus && state.menus.length >= 1) {
            resolve();
            return;
          }
          portal.getSysMenus().then(data => {
            sessionStorage.setItem("currentSysMenus", JSON.stringify(data));
            commit("mutationSysMenus", data);
            resolve(data);
          });
        });
    },
    actionFrontMenus({
        commit,
        state
      }) {
        return new Promise((resolve, reject) => {
          if (state.frontMenus && state.frontMenus.length >= 1) {
            resolve(state.frontMenus);
            return;
          }
          portal.getFrontMenus().then(data => {
            //   console.log(data, 'data')
            // data.push(state.personalMenus[0]);
            sessionStorage.setItem("currentFrontMenus", JSON.stringify(data));
            commit("mutationFrontMenus", data);
            resolve(data);
          });
        });
      },
    // 查询静态资源目录
    getStaticMenus({ commit }) {
        portal.getMenus(menus => {
            commit('appendMenus', menus)
        })
    },
    // 查询流程中心下的资源目录
    getSyncMenus({ commit }, isLeader) {
        portal.getSubMenus('front_menu', response => {
            process.getSecretaryByUserId(res => {
                let isLeader = false;
                if (res && res.length == 0) {//没有领导
                    isLeader = true;
                }
                response.isLeader = isLeader;
                commit('setSyncMenus', response)
            })
        });
    },
    //获取流程中心下的资源目录
    getDefaultMenus({ commit }) {
        return new Promise((resolve, reject) => {
            portal.getSubMenus('front_menu', response => {
                process.getSecretaryByUserId(res => {
                    let isLeader = false;
                    if (res && res.length == 0) {//没有领导
                        isLeader = true;
                    }
                    response.isLeader = isLeader;
                    commit('setSyncMenus', response)
                    resolve();
                })
            });
        })
    },
    // 当前用户接口权限
    getCurrentUserMethodAuth({ commit }) {
        portal.getCurrentUserMethodAuth(response => {
            window.sessionStorage.allMethod = response.data.allMethod;
            window.sessionStorage.methodAuth = response.data.curUserMethod;
        });
    },
     // 当前菜单
    getAllmenus({ commit }, menu) {
        return new Promise((resolve, reject) => {
            resolve(state.all);
         });
    },
    // 当前菜单
    getCurrentMenu({ commit }, menu) {
        commit('setCurrentMenu', menu);
    },
    // 追加一个目录到目录菜单中
    append2menus({ commit, state }, menu) {
        commit('appendMenus', [menu]);
    },
    // 临时设置一个修改过的目录菜单
    setTemplateMenus({ commit }, menu) {
        commit('setMenus', menu);
        commit('setResidual', true);
        setTimeout(() => {
            // 0.5秒后重置手动修改目录数据的标记
            commit('setResidual', false);
        }, 500);
    },
    // 临时设置一个修改过的目录菜单
    setCopyMenus({ commit }, menu) {
        commit('setMenus', menu);
    },
    //更新每页下拉显示数据
    setPaginationSize({ commit, state }, size) {
        commit("setPaginationSize", size);
    },
    //更新第几页
    setPaginationPageNum({ commit, state }, currentPage) {
        commit("setPaginationPageNum", currentPage);
    },
    //获取新闻动态列表
    getNewsPagination({ commit, state }, pagination) {
        return new Promise((resolve, reject) => {
            portal.getNewsPagination(pagination, response => {
                commit("setRows", response.data.rows);//新闻动态数据
                commit("setTotal", response.data.total);//总数据条数
                let pageBean = { "page": response.data.page, "pageSize": response.data.pageSize, "showTotal": "true" };//接口方法返回的pageBean
                commit("setPagination", pageBean);//显示第几页，每页显示多少条
                resolve();
            });
        });
    },
    //根据分类获取轮播图
    getNewsPagination({ commit, state }, type) {
        return new Promise((resolve, reject) => {
            portal.getNewsPagination(type, response => {
                resolve(response.data);
            });
        });
    },
    getNewsPaginationList({commit,state},pagination){
        return new Promise((resolve,reject)=>{
            portal.getNewsPaginationList(pagination,response=>{
                commit("setRows",response.data.rows);
                commit("setTotal",response.data.total);
                let pageBean = {"page":response.data.page,"pageSize":response.data.pageSize,"showTotal":"true"};
                commit("setPagination",pageBean);
                resolve();
            })
        })
    },
    //获取发文公告列表
    getNoticePagination({ commit, state }, pagination) {
        return new Promise((resolve, reject) => {
            portal.getNoticePagination(pagination, response => {
                commit("setNotice", response.data.rows);//发文告数据
                commit("setTotal", response.data.total);//总数据条数
                let pageBean = { "page": response.data.page, "pageSize": response.data.pageSize, "showTotal": "true" };//接口方法返回的pageBean
                commit("setPagination", pageBean);//显示第几页，每页显示多少条
                resolve();
            });
        });
    },
    //根据ID获取新闻公告详情
    getNewsById({ commit, state }, pagination) {
        portal.getNewsById(pagination, response => {
            if (response.data.ffj) {
                let files = JSON.parse(response.data.ffj);
                response.data.ffj = files;
            }
            commit("setFilesData", response.data);//发文告数据
        });
    },
    //附件在线预览
    onlinePreview({ commit, state }, id) {
        return new Promise((resolve, reject) => {
            portal.onlinePreview(id, response => {
                resolve(response.data);
            });
        });
    },
    //附件下载
    downloadFile({ commit, state }, id) {
        portal.downloadFile(id);
    },

    downloadImg({ commit, state }, url) {
        return new Promise((resolve, reject) => {
            portal.downloadImg(url, response => {
                resolve(response);
            });
        });
    },

    //获取要参加的会议列表
    getMeetingPagination({ commit, state }, pagination) {
        return new Promise((resolve, reject) => {
            portal.getMeetingPagination(pagination, response => {
                commit("setMeeting", response.data.rows);//会议数据
                commit("setTotal", response.data.total);//总数据条数
                let pageBean = { "page": response.data.page, "pageSize": response.data.pageSize, "showTotal": "true" };//接口方法返回的pageBean
                commit("setPagination", pageBean);//显示第几页，每页显示多少条
                resolve();
            });
        });
    },
    //获取数据字典
    getByTypeKeyForComBo({ commit, state }, dicKey) {
        return new Promise((resolve, reject) => {
            portal.getByTypeKeyForComBo(dicKey, response => {
                resolve(response);
            });
        });
    },
    //获取下一个流水号
    getNextIdByAlias({ commit, state }, alias) {
        return new Promise((resolve, reject) => {
            portal.getNextIdByAlias(alias, response => {
                resolve(response);
            });
        });
    },
    //获取首页布局
    vueFrontHome({ commit, state }) {
        return new Promise((resolve, reject) => {
            portal.vueFrontHome(response => {
                resolve(response);
            });
        });
    },
    //获取首页布局
    getColumnByAlias({ commit, state }, alias) {
        return new Promise((resolve, reject) => {
            portal.getColumnByAlias(alias, response => {
                resolve(response);
                commit("updateColumnData", response);
            });
        });
    },
    // 批量获取首页布局（请求参数还是逐个栏目，但是一定时间间隔的请求会合并为一次）
    getColumnByAliasBatch({ commit, state, getters }, alias) {
        // 1.如果当前栏目数据中已经有对应的值了，直接返回。
        if (getters.hasColumnDataWithAlias(alias)) {
            return;
        }
        // 2.是否正在进行请求合并；
        if (state.columnQueryMerging) {
            // (1).取消当前倒计时；
            clearTimeout(state.columnQueryMerging);
            // (2).重置当前倒计时取消标记位；
            commit("setColumnQueryMerging", null);
        }
        // 3.构建一个请求倒计时（默认两个请求相差50毫秒内会合并为一个请求）；
        const timeoutCancel = setTimeout(function () {
            // 4.倒计时结束，真正发送请求；
            portal.batchGetColumnByAliases(state.columnAliasAry.join(","), response => {
                // 5.更新栏目数据到vuex的state中。
                commit("setColumnData", response);
            });
            // 清空栏目请求查询别名数组
            commit("clearColumnAliasAry");
            // 重置倒计时取消标记位
            commit("setColumnQueryMerging", null);
        }, 50);
        // 添加栏目请求查询别名到数组
        commit("addColumnAlias", alias);
        // 更新倒计时取消标记位
        commit("setColumnQueryMerging", timeoutCancel);
    }
    ,
    //获取栏目数据
    getColumnData({ commit, state }, column) {
        return new Promise((resolve, reject) => {
            portal.getColumnData(column, response => {
                resolve(response);
            });
        });
    }
    ,
    //更新附件的扩展属性
    updateFileExtraProp({ commit, state }, column) {
        return new Promise((resolve, reject) => {
            portal.updateFileExtraProp(column, response => {
                resolve(response);
            });
        });
    },
    clearMenus({ commit, state }, column){
        commit("clearMenus");
        window.sessionStorage.removeItem("currentFrontMenus");
        window.sessionStorage.removeItem("dict_data");
        window.sessionStorage.removeItem("allMethod");
        window.sessionStorage.removeItem("methodAuth");
    }
}

const mutations = {
    setMenus(state, menus) {
        state.all = menus;
    },
    clearMenus(){
        state.frontMenus = [];
        state.sysMenus = [];
    },
    setResidual(state, val) {
        state.residual = val;
    },
    appendMenus(state, menus) {
        menus.forEach(menu => {
            if (!state.all.some(m => m.alias === menu.alias)) {
                state.all.push(menu);
            }
        });
        state.all.sort((m, n) => { return m.id - n.id });
    },
    setSyncMenus(state, response) {
        if (response && response.data && response.data.value && response.data.value.length > 0) {
            let menus = response.data.value;
            menus.forEach(menu => {
                if (!state.all.some(m => m.code === menu.alias)) {
                    state.all.push({ id: menu.id, code: menu.alias, alias: menu.alias, path: menu.menuUrl, name: menu.name ,sn:menu.sn});
                    //判断是否是流程中心
                    if (menu.alias == "v-flow") {
                        if (response.isLeader) {//没有领导
                            for (let i = 0; i < menu.children.length; i++) {
                                if (menu.children[i].alias == "v-leader") {
                                    menu.children.splice(i, 1);
                                    break;
                                }
                            }
                            state.menuMaps[menu.alias] = menu.children;
                        } else if (!response.isLeader) {//有领导
                            state.menuMaps[menu.alias] = menu.children;
                        }
                    } else {
                        state.menuMaps[menu.alias] = menu.children;
                    }
                }
                // }
            });
        }
    },
    setCurrentMenu(state, response) {
        state.currentMenu = response;
    },
    getAllmenus(state, response){
        return  state.all;
    },
    setPagination(state, pagination) {
        state.pagination = pagination;
    },
    setPaginationSize(state, size) {
        state.pagination.pageSize = size;
    },
    setPaginationPageNum(state, currentPage) {
        state.pagination.page = currentPage;
    },
    setRows(state, rows) {
        state.rows = rows;
    },
    setNotice(state, notice) {
        state.notice = notice;
    },
    setTotal(state, total) {
        state.total = total;
    },
    setFilesData(state, filesData) {
        state.filesData = filesData;
    },
    setMeeting(state, meeting) {
        state.meeting = meeting;
    },
    addColumnAlias(state, alias) {
        state.columnAliasAry.push(alias);
    },
    clearColumnAliasAry(state) {
        state.columnAliasAry = [];
    },
    setColumnQueryMerging(state, val) {
        state.columnQueryMerging = val;
    },
    setColumnData(state, data) {
        let _colData =state.columnData || {}, aliasAry =state.columnDataLoadedAliases?state.columnDataLoadedAliases.split(','): [];
        if (data && data.length > 0) {
            data.forEach(d => {
                aliasAry.push(d.alias);
                _colData[d.alias] = d;
            });
        }
        state.columnData = _colData;
        state.columnDataLoadedAliases = aliasAry.join(",");
    },
    updateColumnData(state, data) {
        if (data && data.alias) {
            state.columnData[data.alias] = data;
        }
    },
    // 前台菜单赋值
    mutationFrontMenus(state, frontMenus) {
        state.frontMenus = frontMenus;
    },
    // 后台菜单赋值
    mutationSysMenus(state, sysMenus) {
        state.sysMenus = sysMenus;
    },
}

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