package com.xhkjedu.sapi.service.system;

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

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

/**
 * @author ywx
 * @classname ModuledefaultService
 * @description 
 * @date 2020/7/2 10:36
 **/
@Service
public class ModuledefaultService {
    @Resource
    private ModuledefaultMapper moduledefaultMapper;
    @Resource
    private ModuleMapper moduleMapper;

    //添加
    @Transactional(rollbackFor = Exception.class)
    public ResultVo save(TModuledefault model) {
        if (model.getLevel() != 1) {
            if (N_Utils.isNotEmpty(model.getModuleurl())) {
                Integer num = moduledefaultMapper.countByUrl(model.getModuleurl(), model.getBelong());
                if (num != 0) {
                    return new ResultVo(1, "该模块地址已存在，禁止添加");
                }
            }
        }

        String id = ApiUtil.getId();
        model.setModuleid(id);
        model.setCreatetime(N_Utils.getSecondTimestamp());
        if (model.getDisplay() == null) model.setDisplay(1);
        if (model.getMdefault() == null) model.setMdefault(0);
        if (model.getLevel() == 1) model.setBelongcode(3);
        moduledefaultMapper.insertSelective(model);

        //当模块为一级（分类）时不需要给学校添加，是二级（模块）时给学校添加
        if(model.getLevel() != 1){
            //获取学校id集合
            List<Integer> schoolids = moduledefaultMapper.listSchoolId();
            if (N_Utils.isListEmpty(schoolids)) return new ResultVo(0, "保存成功", id);
            List<TModule> moduleList = new ArrayList<>();//学校模块集合
            String modulepid = model.getModulepid();
            boolean notEmpty = N_Utils.isNotEmpty(modulepid);
            List<TModule> schoolModuleList = new ArrayList<>();//学校模块集合
            if (notEmpty) {
                TModuledefault mp = findById(modulepid);
                schoolModuleList = moduledefaultMapper.getModuleIdByDefaultId(modulepid, schoolids, mp.getBelong());
            }
            for (Integer schoolid : schoolids) {
                TModule m = new TModule();
                BeanUtils.copyProperties(model, m);
                m.setModuleid(ApiUtil.getId());
                m.setDefaultid(id);
                m.setSchoolid(schoolid);
                if (notEmpty) {
                    TModule schoolModule = schoolModuleList.stream().filter(s -> s.getSchoolid().equals(schoolid)).findFirst().orElse(null);
                    if (schoolModule != null) {
                        m.setModulepid(schoolModule.getModuleid());
                    }
                }
                moduleList.add(m);
            }
            moduleMapper.batchSave(moduleList);//批量保存学校模块信息
        }
        return new ResultVo(0, "保存成功",id);
    }

    //删除
    @Transactional(rollbackFor = Exception.class)
    public Integer deleteById(String id) {
        moduleMapper.deleteByDefaultId(id);
        return moduledefaultMapper.deleteByPrimaryKey(id);
    }

    //修改
    @Transactional(rollbackFor = Exception.class)
    public void update(TModuledefault model) {
        moduledefaultMapper.updateByPrimaryKeySelective(model);//更新默认模块信息
        moduledefaultMapper.updateByDefaultId(model.getModuleid());//更新学校模块信息
    }

    //获取详情
    public TModuledefault findById(String id) {
        return moduledefaultMapper.selectByPrimaryKey(id);
    }

    //获取列表
    public List <TModuledefault> listAll(Integer belong, Integer belongcode, Integer display) {
        List<TModuledefault> modules = new ArrayList<>();
        List<TModule> lst = listModulesTree(belong, belongcode, display,1);
        lst.forEach(m->{
            List<TModule> twomodules = m.getModulechilds();
            m.setModulechilds(null);
            TModuledefault d = copyProperties(m);
            modules.add(d);
            twomodules.forEach(m2->{
                List<TModule> threemodules = m2.getModulechilds();
                m2.setModulechilds(null);
                TModuledefault d2 = copyProperties(m2);
                modules.add(d2);
                threemodules.forEach(m3->{
                    TModuledefault d3 = copyProperties(m3);
                    modules.add(d3);
                });
            });
        });
        return modules;
    }

    /**
     * 复制模块信息
     * @Param [m]
     * @Author ywx
     * @Date 2020/7/2 15:16
     * @return com.xhkjedu.model.system.TModuledefault
     **/
    private TModuledefault copyProperties(TModule m) {
        TModuledefault moduledefault = new TModuledefault();
        moduledefault.setModuleid(m.getModuleid());
        moduledefault.setModulename(m.getModulename());
        moduledefault.setMabbrevname(m.getMabbrevname());
        moduledefault.setModuleurl(m.getModuleurl());
        moduledefault.setModuleico(m.getModuleico());
        moduledefault.setModulepid(m.getModulepid());
        moduledefault.setMorder(m.getMorder());
        moduledefault.setMinout(m.getMinout());
        moduledefault.setMclass(m.getMclass());
        moduledefault.setLevel(m.getLevel());
        moduledefault.setComm(m.getComm());
        moduledefault.setCreatetime(m.getCreatetime());
        moduledefault.setMdefault(m.getMdefault());
        moduledefault.setBelong(m.getBelong());
        moduledefault.setBelongcode(m.getBelongcode());
        moduledefault.setDisplay(m.getDisplay());
        return moduledefault;
    }

    public List<TModule> listModulesTree(Integer belong, Integer belongcode, Integer display,Integer ly){
        List<TModule> lst = new ArrayList<>();
        if(ly == 1){
            lst = moduledefaultMapper.listModulesByBelong(belong, belongcode,display);
        }else if(ly == 2){
            lst = moduledefaultMapper.listAllModules();
        }

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

    //首层模块
    public List<ModuleSelVo> listLevelModule(Integer belong) {
        return moduledefaultMapper.listLevelModule(belong);
    }
}
