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

import cn.com.tenlion.configcolumn.pojo.dtos.configcolumngroup.ConfigColumnGroupDTO;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumnset.ConfigColumnSetDTO;
import cn.com.tenlion.configcolumn.service.configcolumngroup.IConfigColumnGroupService;
import cn.com.tenlion.configcolumn.service.configcolumnset.IConfigColumnSetService;
import cn.com.tenlion.configtable.pojo.dtos.configtable.ConfigTableDTO;
import cn.com.tenlion.configtable.pojo.dtos.configtableoperation.ConfigTableOperationDTO;
import cn.com.tenlion.configtable.pojo.dtos.configtableoperation.ConfigTableOperationGroupDTO;
import cn.com.tenlion.configtable.service.configtableoperation.IConfigTableOperationService;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.SearchException;
import ink.wgink.pojo.ListPage;
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.configcolumn.IConfigColumnDao;
import cn.com.tenlion.configcolumn.pojo.dtos.configcolumn.ConfigColumnDTO;
import cn.com.tenlion.configcolumn.pojo.vos.configcolumn.ConfigColumnVO;
import cn.com.tenlion.configcolumn.pojo.bos.configcolumn.ConfigColumnBO;
import cn.com.tenlion.configcolumn.pojo.pos.configcolumn.ConfigColumnPO;
import cn.com.tenlion.configcolumn.service.configcolumn.IConfigColumnService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @ClassName: ConfigColumnServiceImpl
 * @Description: 
 * @Author: CodeFactory
 * @Date: 2021-06-26 13:49:46
 * @Version: 3.0
 **/
@Service
public class ConfigColumnServiceImpl extends DefaultBaseService implements IConfigColumnService {

    @Autowired
    private IConfigColumnDao configColumnDao;
    @Autowired
    private IConfigColumnGroupService iConfigColumnGroupService;
    @Autowired
    private IConfigTableOperationService iConfigTableOperationService;
    @Autowired
    private IConfigColumnSetService iConfigColumnSetService;

    @Override
    public void save(ConfigColumnVO configColumnVO) {
        saveReturnId(configColumnVO);
    }

    @Override
    public void save(String token, ConfigColumnVO configColumnVO) {
        saveReturnId(token, configColumnVO);
    }

    @Override
    public String saveReturnId(ConfigColumnVO configColumnVO) {
        return saveReturnId(null, configColumnVO);
    }

    @Override
    public String saveReturnId(String token, ConfigColumnVO configColumnVO) {
        String configColumnId = UUIDUtil.getUUID();
        String configColumnCode = configColumnVO.getConfigColumnCode().trim();
        ConfigColumnDTO configColumnDTO = getByCode(configColumnCode);
        if(configColumnDTO != null) {
            throw new SaveException("该编码已经存在");
        }
        configColumnVO.setConfigColumnCode(configColumnCode);
        Map<String, Object> params = HashMapUtil.beanToMap(configColumnVO);
        params.put("configColumnId", configColumnId);
        if (StringUtils.isBlank(token)) {
            setSaveInfo(params);
        } else {
            setAppSaveInfo(token, params);
        }
        configColumnDao.save(params);
        return configColumnId;
    }

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

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

    @Override
    public void update(String configColumnId, ConfigColumnVO configColumnVO) {
        update(null, configColumnId, configColumnVO);
    }

    @Override
    public void update(String token, String configColumnId, ConfigColumnVO configColumnVO) {
        Map<String, Object> params = HashMapUtil.beanToMap(configColumnVO);
        params.put("configColumnId", configColumnId);
        if (StringUtils.isBlank(token)) {
            setUpdateInfo(params);
        } else {
            setAppUpdateInfo(token, params);
        }
        configColumnDao.update(params);
    }

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

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

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

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

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

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

    @Override
    public List<ConfigColumnDTO> list(Map<String, Object> params) {
        List<ConfigColumnDTO> list = configColumnDao.list(params);
        List<String> configColumnGroupIds = new ArrayList<>();
        for (ConfigColumnDTO dto : list) {
            configColumnGroupIds.add(dto.getConfigColumnGroupId());
        }
        // 封装栏目组的名称
        Map<String, Object> query = new HashMap<String, Object>();
        query.put("configColumnGroupIds", configColumnGroupIds);
        List<ConfigColumnGroupDTO> configColumnGroupDTOS = iConfigColumnGroupService.list(query);
        for (ConfigColumnDTO dto : list) {
            for (ConfigColumnGroupDTO dtoGroup : configColumnGroupDTOS) {
                if(dtoGroup.getConfigColumnGroupId().equals(dto.getConfigColumnGroupId())) {
                    dto.setConfigColumnGroupName(dtoGroup.getConfigColumnGroupName());
                }
            }
        }
        return list;
    }

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

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

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

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

    @Override
    public List<ConfigColumnDTO> getByGroupId(String id) {
        Map<String, Object> params = super.getHashMap(2);
        params.put("configColumnGroupId", id);
        return configColumnDao.getByGroupId(params);
    }

    @Override
    public ConfigColumnDTO getByCode(String configColumnCode) {
        Map<String, Object> params = super.getHashMap(2);
        params.put("configColumnCode", configColumnCode);
        return configColumnDao.getByCode(params);
    }

    @Override
    public String saveData(String token, String configColumnId, Map<String, Object> params) {
        ConfigColumnDTO configColumnDTO = get(configColumnId);
        if(configColumnDTO == null) {
            throw new SaveException("该栏目不存在");
        }
        if(!"1".equals(configColumnDTO.getConfigColumnStatus())) {
            throw new SaveException("该栏目已关闭");
        }
        return iConfigTableOperationService.saveDataById(token, configColumnDTO.getConfigTableId(), params);
    }

    @Override
    public void deleteData(String token, String configColumnId, String uid) {
        ConfigColumnDTO configColumnDTO = get(configColumnId);
        if(configColumnDTO == null) {
            throw new SaveException("该栏目不存在");
        }
        if(!"1".equals(configColumnDTO.getConfigColumnStatus())) {
            throw new SaveException("该栏目已关闭");
        }
        iConfigTableOperationService.deleteDataById(token, configColumnDTO.getConfigTableId(), uid);
    }

    @Override
    public ConfigTableOperationGroupDTO getData(String token, String configColumnId, String uid) {
        ConfigColumnDTO configColumnDTO = get(configColumnId);
        if(configColumnDTO == null) {
            throw new SaveException("该栏目不存在");
        }
        if(!"1".equals(configColumnDTO.getConfigColumnStatus())) {
            throw new SaveException("该栏目已关闭");
        }
        return iConfigTableOperationService.getData(token, configColumnDTO.getConfigTableId(), uid);
    }

    @Override
    public List<ConfigTableOperationGroupDTO> listData(String token, String configColumnId, Map<String, Object> params) {
        ConfigColumnDTO configColumnDTO = get(configColumnId);
        if(configColumnDTO == null) {
            throw new SaveException("该栏目不存在");
        }
        if(!"1".equals(configColumnDTO.getConfigColumnStatus())) {
            throw new SaveException("该栏目已关闭");
        }
        return iConfigTableOperationService.listMyData(token, configColumnDTO.getConfigTableId(), params);
    }

    @Override
    public List<ConfigTableOperationDTO> listFieldConfig(String token, String configColumnId) {
        ConfigColumnDTO configColumnDTO = get(configColumnId);
        if(configColumnDTO == null) {
            throw new SaveException("该栏目不存在");
        }
        if(!"1".equals(configColumnDTO.getConfigColumnStatus())) {
            throw new SaveException("该栏目已关闭");
        }
        List<ConfigTableOperationDTO> configTableOperationDTOList = iConfigTableOperationService.listFieldConfig(token, configColumnDTO.getConfigTableId());
        return configTableOperationDTOList;
    }

    @Override
    public List<ConfigTableOperationGroupDTO> listDataByCode(String token, String configColumnCode, Map<String, Object> params) {
        ConfigColumnDTO configColumnDTO = getByCode(configColumnCode);
        return listData(token, configColumnDTO.getConfigColumnId(), params);
    }

    @Override
    public List<ConfigColumnDTO> listApp(String token, Map<String, Object> params) {
        params.put("configColumnStatus", "1");
        List<ConfigColumnDTO> list = configColumnDao.list(params);
        /**
         * 封装自定义的显示隐藏 . 自定义的栏目名称
         */
        List<ConfigColumnDTO> resultList = new ArrayList<ConfigColumnDTO>();
        // 首页是加载名片创建者userId下配置的所有栏目, 个人中心加载的是token下配置的所有栏目
        String userIdOrToken = getAppTokenUser(token).getId();
        if(params.get("creator") != null) {
            userIdOrToken = params.get("creator").toString();
        }
        for(ConfigColumnDTO dto : list) {
            ConfigColumnSetDTO setDisplayDTO = iConfigColumnSetService.getSetDisplayByUserId(userIdOrToken, dto.getConfigColumnId());
            ConfigColumnSetDTO setNameDTO = iConfigColumnSetService.getSetNameByUserId(userIdOrToken, dto.getConfigColumnId());
            ConfigTableDTO tableDTO = iConfigTableOperationService.getTable(dto.getConfigTableId());
            if (tableDTO != null) {
                dto.setConfigTableMode(tableDTO.getConfigTableMode());
            }
            // 封装自定义名称
            if (setNameDTO != null) {
                dto.setConfigColumnSetName(setNameDTO.getConfigColumnName());
                dto.setConfigColumnName(setNameDTO.getConfigColumnName());
            }
            // 封装自定义是否显示
            if (setDisplayDTO == null) {
                dto.setConfigColumnSet("1");
                resultList.add(dto);
            }else{
                // 不显示
                continue;
            }
        }
        return resultList;
    }

    @Override
    public List<ConfigColumnDTO> listByTableId(String tableId) throws SearchException {
        Map<String, Object> params = getHashMap(2);
        params.put("configTableId", tableId);
        return list(params);
    }
}