package cn.com.tenlion.configcolumn.service.configcolumngroup.impl;

import cn.com.tenlion.configcolumn.pojo.dtos.configcolumn.ConfigColumnDTO;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumnset.ConfigColumnSetDTO;
import cn.com.tenlion.configcolumn.service.configcolumn.IConfigColumnService;
import cn.com.tenlion.configcolumn.service.configcolumnset.IConfigColumnSetService;
import cn.com.tenlion.configtable.pojo.dtos.configtable.ConfigTableDTO;
import cn.com.tenlion.configtable.service.configtable.IConfigTableService;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.RemoveException;
import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.SearchException;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.util.map.HashMapUtil;
import ink.wgink.util.UUIDUtil;
import cn.com.tenlion.configcolumn.dao.configcolumngroup.IConfigColumnGroupDao;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumngroup.ConfigColumnGroupDTO;
import cn.com.tenlion.configcolumn.pojo.vos.configcolumngroup.ConfigColumnGroupVO;
import cn.com.tenlion.configcolumn.pojo.bos.configcolumngroup.ConfigColumnGroupBO;
import cn.com.tenlion.configcolumn.pojo.pos.configcolumngroup.ConfigColumnGroupPO;
import cn.com.tenlion.configcolumn.service.configcolumngroup.IConfigColumnGroupService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;

/**
 * @ClassName: ConfigColumnGroupServiceImpl
 * @Description: 
 * @Author: CodeFactory
 * @Date: 2021-06-26 13:59:22
 * @Version: 3.0
 **/
@Service
public class ConfigColumnGroupServiceImpl extends DefaultBaseService implements IConfigColumnGroupService {

    @Autowired
    private IConfigColumnGroupDao configColumnGroupDao;
    @Autowired
    private IConfigColumnService iConfigColumnService;
    @Autowired
    private IConfigTableService iConfigTableService;
    @Autowired
    private IConfigColumnSetService iConfigColumnSetService;

    @Override
    public void save(ConfigColumnGroupVO configColumnGroupVO) {
        saveReturnId(configColumnGroupVO);
    }

    @Override
    public void save(String token, ConfigColumnGroupVO configColumnGroupVO) {
        saveReturnId(token, configColumnGroupVO);
    }

    @Override
    public String saveReturnId(ConfigColumnGroupVO configColumnGroupVO) {
        return saveReturnId(null, configColumnGroupVO);
    }

    @Override
    public String saveReturnId(String token, ConfigColumnGroupVO configColumnGroupVO) {
        String configColumnGroupId = UUIDUtil.getUUID();
        /**
         * 查询编号是否已经存在, 存在不允许删除
         */
        String configColumnGroupCode = configColumnGroupVO.getConfigColumnGroupCode().trim();
        ConfigColumnGroupDTO configColumnGroupDTO = configColumnGroupDao.getByCode(configColumnGroupCode);
        if(configColumnGroupDTO != null) {
            throw new SaveException("该编号已经存在");
        }
        configColumnGroupVO.setConfigColumnGroupCode(configColumnGroupCode);
        Map<String, Object> params = HashMapUtil.beanToMap(configColumnGroupVO);
        params.put("configColumnGroupId", configColumnGroupId);
        if (StringUtils.isBlank(token)) {
            setSaveInfo(params);
        } else {
            setAppSaveInfo(token, params);
        }
        configColumnGroupDao.save(params);
        return configColumnGroupId;
    }

    @Override
    public void remove(List<String> ids) {
        remove(null, ids);
    }

    @Override
    public void remove(String token, List<String> ids) {
        Map<String, Object> params = getHashMap(2);
        params.put("configColumnGroupIds", ids);
        if (StringUtils.isBlank(token)) {
            setUpdateInfo(params);
        } else {
            setAppUpdateInfo(token, params);
        }
        configColumnGroupDao.remove(params);
    }

    @Override
    public void delete(List<String> ids) {
        for(String id : ids) {
            List<ConfigColumnDTO> columnList = iConfigColumnService.getByGroupId(id);
            if(columnList.size() > 0) {
                throw new RemoveException("已绑定栏目的栏目组不能删除");
            }
        }
        Map<String, Object> params = getHashMap(2);
        params.put("configColumnGroupIds", ids);
        configColumnGroupDao.delete(params);
    }

    @Override
    public void update(String configColumnGroupId, ConfigColumnGroupVO configColumnGroupVO) {
        update(null, configColumnGroupId, configColumnGroupVO);
    }

    @Override
    public void update(String token, String configColumnGroupId, ConfigColumnGroupVO configColumnGroupVO) {
        Map<String, Object> params = HashMapUtil.beanToMap(configColumnGroupVO);
        params.put("configColumnGroupId", configColumnGroupId);
        if (StringUtils.isBlank(token)) {
            setUpdateInfo(params);
        } else {
            setAppUpdateInfo(token, params);
        }
        configColumnGroupDao.update(params);
    }

    @Override
    public ConfigColumnGroupDTO get(Map<String, Object> params) {
        return configColumnGroupDao.get(params);
    }

    @Override
    public ConfigColumnGroupDTO getByCode(String configColumnGroupCode) {
        ConfigColumnGroupDTO configColumnGroupDTO = configColumnGroupDao.getByCode(configColumnGroupCode);
        if(configColumnGroupDTO == null) {
            throw new SearchException("栏目组不存在");
        }
        if(!"1".equals(configColumnGroupDTO.getConfigColumnGroupStatus())) {
            throw new SearchException("栏目组已关闭");
        }
        // 封装栏目组下的所有栏目
        List<ConfigColumnDTO> list = iConfigColumnService.getByGroupId(configColumnGroupDTO.getConfigColumnGroupId());
        List<ConfigColumnDTO> configColumnList = new ArrayList<ConfigColumnDTO>();
        // 只加载显示的栏目
        for(ConfigColumnDTO dto : list) {
            if ("1".equals(dto.getConfigColumnStatus())) {
                configColumnList.add(dto);
            }
        }
        configColumnGroupDTO.setConfigColumnList(configColumnList);
        return configColumnGroupDTO;
    }

    @Override
    public ConfigColumnGroupDTO get(String configColumnGroupId) {
        Map<String, Object> params = super.getHashMap(2);
        params.put("configColumnGroupId", configColumnGroupId);
        return get(params);
    }

    @Override
    public ConfigColumnGroupBO getBO(Map<String, Object> params) {
        return configColumnGroupDao.getBO(params);
    }

    @Override
    public ConfigColumnGroupBO getBO(String configColumnGroupId) {
        Map<String, Object> params = super.getHashMap(2);
        params.put("configColumnGroupId", configColumnGroupId);
        return getBO(params);
    }

    @Override
    public ConfigColumnGroupPO getPO(Map<String, Object> params) {
        return configColumnGroupDao.getPO(params);
    }

    @Override
    public ConfigColumnGroupPO getPO(String configColumnGroupId) {
        Map<String, Object> params = super.getHashMap(2);
        params.put("configColumnGroupId", configColumnGroupId);
        return getPO(params);
    }

    @Override
    public List<ConfigColumnGroupDTO> list(Map<String, Object> params) {
        return configColumnGroupDao.list(params);
    }

    @Override
    public List<ConfigColumnGroupBO> listBO(Map<String, Object> params) {
        return configColumnGroupDao.listBO(params);
    }

    @Override
    public List<ConfigColumnGroupPO> listPO(Map<String, Object> params) {
        return configColumnGroupDao.listPO(params);
    }

    @Override
    public SuccessResultList<List<ConfigColumnGroupDTO>> listPage(ListPage page) {
        PageHelper.startPage(page.getPage(), page.getRows());
        List<ConfigColumnGroupDTO> configColumnGroupDTOs = list(page.getParams());
        PageInfo<ConfigColumnGroupDTO> pageInfo = new PageInfo<>(configColumnGroupDTOs);
        return new SuccessResultList<>(configColumnGroupDTOs, pageInfo.getPageNum(), pageInfo.getTotal());
    }

    @Override
    public Integer count(Map<String, Object> params) {
        Integer count = configColumnGroupDao.count(params);
        return count == null ? 0 : count;
    }

    @Override
    public List<ConfigColumnGroupDTO> listToApp(String token, Map<String, Object> params) {
        // 只加载显示状态为true的栏目组
        params.put("configColumnGroupStatus", "1");
        List<ConfigColumnGroupDTO> configColumnGroupDTOs = list(params);
        for(ConfigColumnGroupDTO groupDTO :  configColumnGroupDTOs) {
            // 封装栏目组下的所有栏目
            List<ConfigColumnDTO> list = iConfigColumnService.getByGroupId(groupDTO.getConfigColumnGroupId());
            List<ConfigColumnDTO> configColumnList = new ArrayList<ConfigColumnDTO>();
            // 只加载显示的栏目
            for(ConfigColumnDTO dto : list) {
                if ("1".equals(dto.getConfigColumnStatus())) {
                    ConfigColumnSetDTO setDisplayDTO = iConfigColumnSetService.getSetDisplay(token, dto.getConfigColumnId());
                    ConfigColumnSetDTO setNameDTO = iConfigColumnSetService.getSetName(token, dto.getConfigColumnId());
                    // 封装自定义名称
                    if (setNameDTO != null) {
                        dto.setConfigColumnName(setNameDTO.getConfigColumnName());
                        dto.setConfigColumnSetName(setNameDTO.getConfigColumnName());
                    }
                    // 封装自定义是否显示
                    if (setDisplayDTO == null) {
                        dto.setConfigColumnSet("1");
                        /**
                         * 查询动态表配置数据, 将表单存储方式封装进来, 用于前台做新增按钮隐藏显示判断使用
                         */
                        ConfigTableDTO configTableDTO = iConfigTableService.get(dto.getConfigTableId());
                        dto.setConfigTableMode(configTableDTO.getConfigTableMode());
                        configColumnList.add(dto);
                    }else{
                        // 不显示
                        continue;
                    }
                }
            }
            groupDTO.setConfigColumnList(configColumnList);
        }
        return configColumnGroupDTOs;
    }

}