package com.xhkjedu.sapi.service.system;

import com.xhkjedu.sapi.mapper.system.ModuleMapper;
import com.xhkjedu.sapi.mapper.system.ModuledefaultMapper;
import com.xhkjedu.sapi.mapper.system.RoleModuleMapper;
import com.xhkjedu.sapi.model.system.TModule;
import com.xhkjedu.sapi.model.system.TModuledefault;
import com.xhkjedu.sapi.model.system.TRoleModule;
import com.xhkjedu.sapi.utils.ApiUtil;
import com.xhkjedu.sapi.vo.system.ModuleSelVo;
import com.xhkjedu.utils.N_Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName ModuleService
 * Description TODO
 * Author WN
 * Date 2020/6/11 16:16
 **/
@Service
public class ModuleService {
    @Autowired
    private ModuleMapper moduleMapper;
    @Autowired
    private RoleModuleMapper roleModuleMapper;
    @Resource
    private ModuledefaultMapper moduledefaultMapper;

    /**
     *功能描述 添加
     * @author WN
     * @date 2020/6/11
     * @param  * @param module
     * @return java.lang.Integer
     */
    @Transactional(rollbackFor = Exception.class)
    public Integer add(TModule module){
        String id = ApiUtil.getId();
        module.setModuleid(id);
        int timestamp = N_Utils.getSecondTimestamp();
        module.setCreatetime(timestamp);
        if(module.getLevel() == 1) {
            module.setBelongcode(3);
        }
        module.setDisplaytype(2);
        module.setSourcetype(2);
        module.setDefaultbcode(module.getBelongcode());
        int result = moduleMapper.insertSelective(module);
        Integer schoolid = module.getSchoolid();
        Integer createid = module.getCreateid();
        Integer roleid=moduleMapper.getRoleIdBySchoolId(schoolid);//根据学校id获取管理员角色id
        //角色模块
        TRoleModule rm=new TRoleModule();
        rm.setRoleid(roleid);
        rm.setModuleid(id);
        rm.setCreateid(createid);
        rm.setCreatetime(timestamp);
        rm.setSchoolid(schoolid);
        rm.setBelongcode(module.getBelongcode());
        roleModuleMapper.insertSelective(rm);
        return result;
    }

    /**
     *功能描述 修改
     * @author WN
     * @date 2020/6/11
     * @param  * @param module
     * @return java.lang.Integer
     */
    public Integer update(TModule module){
        TModule original=moduleMapper.selectByPrimaryKey(module.getModuleid());

        if(original!=null && original.getSourcetype() == 1 && original.getLevel() == 2 && N_Utils.isNotEmpty(original.getDefaultid())){
            //说明是区域创建模块，判断区域模块belongcode,
            TModuledefault moduledefault = moduledefaultMapper.selectByPrimaryKey(original.getDefaultid());
            if(moduledefault!=null && moduledefault.getBelongcode() == 3 && !original.getBelongcode().equals(module.getBelongcode())){
                //区域模块，区域模块为3，则学校可以自行修改
                moduleMapper.updateBelongcodeByModuleid(module);
            }else{
                module.setBelongcode(null);
            }
        }

        return moduleMapper.updateByPrimaryKeySelective(module);
    }

    /**
     *功能描述  删除
     * @author WN
     * @date 2020/6/11
     * @param  * @param moduleid
     * @return java.lang.Integer
     */
    public Integer del(String moduleid){
        return moduleMapper.deleteByPrimaryKey(moduleid);
    }


    /**
     *功能描述 所有模块
     * @author WN
     * @date 2020/6/11
     * @param  * @param schoolid
     * @param display
     * @return java.util.List<com.xhkjedu.model.system.TModule>
     */
    public List<TModule> listModules(TModule module){
        List<TModule> modules = new ArrayList<>();
        List<TModule> lst = listModulesTree(module);
        lst.forEach(m->{
            List<TModule> twomodules = m.getModulechilds();
            m.setModulechilds(null);
            modules.add(m);
            twomodules.forEach(m2->{
                List<TModule> threemodules = m2.getModulechilds();
                m2.setModulechilds(null);
                modules.add(m2);
                threemodules.forEach(m3->{
                    modules.add(m3);
                });
            });
        });
        return modules;
    }

    //获取第一层模块
    public List<ModuleSelVo> listLevelModule(Integer schoolid,Integer belong){
        return moduleMapper.listLevelModule(schoolid,belong);
    }

    /**
     *功能描述  所有模块树形结构
     * @author WN
     * @date 2020/6/15
     * @param  * @param schoolid
     * @param display
     * @return java.util.List<com.xhkjedu.model.system.TModule>
     */
    public List<TModule> listModulesTree(TModule module){
        List<TModule> lst = moduleMapper.listModules(module);

        List<TModule> rtnlst = new ArrayList<>();

        for(TModule m : lst){
            if(m.getLevel()==1){
                rtnlst.add(m);
            }
        }

        for(TModule m : rtnlst){
            List<TModule> childs = m.getModulechilds();
            for(TModule mc: lst){
                if(m.getModuleid().equals(mc.getModulepid())){
                    if(!isExistModule(childs,m.getModuleid())){
                        childs.add(mc);
                    }
                }
            }
        }

        return rtnlst;
    }

    //判断集合中是否存在模块
    private boolean isExistModule(List<TModule> lst,String moduleid){
        for(TModule m: lst){
            if(m.getModuleid().equals(moduleid)){
                return true;
            }
        }
        return false;
    }

    /**
     * 模块上移
     * @Param [modules]
     * @Author ywx
     * @Date 2020/8/31 16:24
     * @return void
     **/
    public void moveUp(List<TModule> modules) {
        for (int i = 0; i < modules.size(); i++) {
            TModule module = modules.get(i);
            if (module.getModulepid() == null){
                return;
            }
            if (i == 0) {
                if (module.getMorder() == 1){
                    return;
                }
                moduleMapper.updateOrder(module);
                Integer morder = modules.get(1).getMorder();
                module.setMorder(morder);
            } else {
                module.setMorder(module.getMorder()+1);
            }
        }
        moduleMapper.moveUp(modules);
    }

    //模块选择列表
    public List<Map> listForSel2(Integer schoolid, Integer belong,Integer belongcode) {
        return moduleMapper.listForSel2(schoolid, belong,belongcode);
    }

    /**
     * 批量保存
     *
     * @param [modules]
     * @return void
     * @author ywx
     * @date 2022/5/24 10:26
     */
    public void batchSave(List<TModule> modules) {
        moduleMapper.batchSave(modules);
    }

    //修改模块状态
    public void updateModuleDisplay(String moduleid,Integer dispaly){
        //获取模块信息
        TModule originModule = moduleMapper.selectByPrimaryKey(moduleid);
        if(originModule.getLevel() == 1){
            //如果是第一层，则这修改本模块以及子模块
            moduleMapper.updateBatchModuleDisplayForLevel(moduleid,dispaly);
        }else{
            moduleMapper.updateModuleDisplay(moduleid,dispaly);
        }

    }
}
