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

import cn.com.tenlion.configcolumn.dao.configcolumngroup.IConfigColumnGroupDao;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumn.ConfigColumnDTO;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumngroup.ConfigColumnGroupDTO;
import cn.com.tenlion.configcolumn.pojo.vos.configcolumnset.ConfigColumnSetDisplayVO;
import cn.com.tenlion.configcolumn.pojo.vos.configcolumnset.ConfigColumnSetNameVO;
import cn.com.tenlion.configcolumn.service.configcolumn.IConfigColumnService;
import cn.com.tenlion.configcolumn.service.configcolumngroup.IConfigColumnGroupService;
import cn.com.tenlion.configtable.pojo.dtos.configtable.ConfigTableDTO;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.app.AppTokenUser;
import ink.wgink.pojo.bos.UserInfoBO;
import ink.wgink.pojo.result.SuccessResult;
import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.util.map.HashMapUtil;
import ink.wgink.util.UUIDUtil;
import cn.com.tenlion.configcolumn.dao.configcolumnset.IConfigColumnSetDao;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumnset.ConfigColumnSetDTO;
import cn.com.tenlion.configcolumn.pojo.vos.configcolumnset.ConfigColumnSetVO;
import cn.com.tenlion.configcolumn.pojo.bos.configcolumnset.ConfigColumnSetBO;
import cn.com.tenlion.configcolumn.pojo.pos.configcolumnset.ConfigColumnSetPO;
import cn.com.tenlion.configcolumn.service.configcolumnset.IConfigColumnSetService;
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: ConfigColumnSetServiceImpl
 * @Description: 
 * @Author: CodeFactory
 * @Date: 2021-07-09 09:48:21
 * @Version: 3.0
 **/
@Service
public class ConfigColumnSetServiceImpl extends DefaultBaseService implements IConfigColumnSetService {

    @Autowired
    private IConfigColumnSetDao configColumnSetDao;

    @Autowired
    private IConfigColumnGroupService iConfigColumnGroupService;

    @Autowired
    private IConfigColumnService iConfigColumnService;

    private String getUserId(String token) {
        String userId = "1";
        if (StringUtils.isBlank(token)) {
            UserInfoBO userInfoBO = this.securityComponent.getCurrentUser();
            userId = userInfoBO.getUserId();
        } else {
            AppTokenUser appTokenUser = this.getAppTokenUser(token);
            userId = appTokenUser.getId();
        }
        return userId;
    }

    @Override
    public void saveDisplay(String token, ConfigColumnSetDisplayVO configColumnSetDisplayVO) {
        String configColumnId = configColumnSetDisplayVO.getConfigColumnId();
        ConfigColumnSetDTO setDTO = getSetDisplay(token, configColumnId);
        if (setDTO != null) {
            // 执行删除
            List<String> ids = new ArrayList<String>();
            ids.add(setDTO.getConfigColumnSetId());
            delete(ids);
        }else {
            // 执行新增
            String configColumnSetId = UUIDUtil.getUUID();
            Map<String, Object> params = HashMapUtil.beanToMap(configColumnSetDisplayVO);
            params.put("configColumnSetId", configColumnSetId);
            params.put("configColumnName", "");
            if (StringUtils.isBlank(token)) {
                setSaveInfo(params);
            } else {
                setAppSaveInfo(token, params);
            }
            configColumnSetDao.save(params);
        }
    }

    @Override
    public void saveName(String token, ConfigColumnSetNameVO configColumnSetNameVO) {
        String configColumnId = configColumnSetNameVO.getConfigColumnId();
        ConfigColumnSetDTO setDTO = getSetName(token, configColumnId);
        if (setDTO != null) {
            // 执行修改
            setDTO.setConfigColumnName(configColumnSetNameVO.getConfigColumnName());
            Map<String, Object> params = HashMapUtil.beanToMap(setDTO);
            if (StringUtils.isBlank(token)) {
                setUpdateInfo(params);
            } else {
                setAppUpdateInfo(token, params);
            }
            configColumnSetDao.update(params);
        }else {
            // 执行新增
            String configColumnSetId = UUIDUtil.getUUID();
            Map<String, Object> params = HashMapUtil.beanToMap(configColumnSetNameVO);
            params.put("configColumnSetId", configColumnSetId);
            if (StringUtils.isBlank(token)) {
                setSaveInfo(params);
            } else {
                setAppSaveInfo(token, params);
            }
            configColumnSetDao.save(params);
        }
    }

    @Override
    public ConfigColumnSetDTO getSetName(String token, String configColumnId) {
        Map<String, Object> params = getHashMap(3);
        params.put("userId", getUserId(token));
        params.put("configColumnId", configColumnId);
        params.put("configColumnSetMode", "2");
        return get(params);
    }

    @Override
    public ConfigColumnSetDTO getSetDisplay(String token, String configColumnId) {
        Map<String, Object> params = getHashMap(3);
        params.put("userId", getUserId(token));
        params.put("configColumnId", configColumnId);
        params.put("configColumnSetMode", "1");
        return get(params);
    }

    @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("configColumnSetIds", ids);
        if (StringUtils.isBlank(token)) {
            setUpdateInfo(params);
        } else {
            setAppUpdateInfo(token, params);
        }
        configColumnSetDao.remove(params);
    }

    @Override
    public void delete(List<String> ids) {
        Map<String, Object> params = getHashMap(2);
        params.put("configColumnSetIds", ids);
        configColumnSetDao.delete(params);
    }

    @Override
    public void update(String configColumnSetId, ConfigColumnSetVO configColumnSetVO) {
        update(null, configColumnSetId, configColumnSetVO);
    }

    @Override
    public void update(String token, String configColumnSetId, ConfigColumnSetVO configColumnSetVO) {
        Map<String, Object> params = HashMapUtil.beanToMap(configColumnSetVO);
        params.put("configColumnSetId", configColumnSetId);
        if (StringUtils.isBlank(token)) {
            setUpdateInfo(params);
        } else {
            setAppUpdateInfo(token, params);
        }
        configColumnSetDao.update(params);
    }

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

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

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

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

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

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

    @Override
    public List<ConfigColumnGroupDTO> listToApp(String token, Map<String, Object> params) {
        // 只加载显示状态为true的栏目组 , 跳转栏目列表的栏目组
        params.put("configColumnGroupStatus", "1");
        params.put("configColumnGroupTargetMode", "4");
        List<ConfigColumnGroupDTO> configColumnGroupDTOs = iConfigColumnGroupService.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 = getSetDisplay(token, dto.getConfigColumnId());
                    ConfigColumnSetDTO setNameDTO = getSetName(token, dto.getConfigColumnId());
                    // 封装自定义名称
                    if (setNameDTO != null) {
                        dto.setConfigColumnRemark(dto.getConfigColumnName());
                        dto.setConfigColumnName(setNameDTO.getConfigColumnName());
                    }
                    // 封装自定义是否显示
                    if (setDisplayDTO == null) {
                        dto.setConfigColumnSet("1");
                    }else{
                        dto.setConfigColumnSet("0");
                    }
                    configColumnList.add(dto);
                }
            }
            groupDTO.setConfigColumnList(configColumnList);
        }
        return configColumnGroupDTOs;
    }

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

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

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

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

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

    @Override
    public ConfigColumnSetDTO getSetNameByUserId(String userId, String configColumnId) {
        Map<String, Object> params = getHashMap(3);
        params.put("userId", userId);
        params.put("configColumnId", configColumnId);
        params.put("configColumnSetMode", "2");
        return get(params);
    }

    @Override
    public ConfigColumnSetDTO getSetDisplayByUserId(String userId, String configColumnId) {
        Map<String, Object> params = getHashMap(3);
        params.put("userId", userId);
        params.put("configColumnId", configColumnId);
        params.put("configColumnSetMode", "1");
        return get(params);
    }

}