package com.jwipc.sys.logic.impl;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.jwipc.exception.DaoException;
import com.jwipc.page.PageUtil;
import com.jwipc.page.PageView;
import com.jwipc.security.LoginUtil;
import com.jwipc.sys.convert.SysConfigConvert;
import com.jwipc.sys.dto.FileResposeDTO;
import com.jwipc.sys.dto.SysConfigDTO;
import com.jwipc.sys.entity.SysConfig;
import com.jwipc.sys.logic.FileLogic;
import com.jwipc.sys.logic.SysConfigLogic;
import com.jwipc.sys.model.po.SysConfigPO;
import com.jwipc.sys.model.query.SysConfigQuery;
import com.jwipc.sys.service.ISysConfigService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * @author shenyang.ou
 * @date 2024/2/2 17:01
 * @desc 系统参数
 */
@Service
@RequiredArgsConstructor
public class SysConfigLogicImpl implements SysConfigLogic {
    private final ISysConfigService sysConfigService;
    private final SysConfigConvert sysConfigConvert;
    private final FileLogic fileLogic;

    @Override
    public PageView findByPage(SysConfigQuery query) {
        final Page<SysConfig> dbPage = PageUtil.toPage(query);
        List<SysConfigPO> sysConfigPOS = sysConfigService.findPageByQuery(dbPage, query);
        List<SysConfigDTO> sysConfigDTOS = sysConfigConvert.po2DTOList(sysConfigPOS);
        return PageUtil.getPV(sysConfigDTOS, dbPage.getTotal());
    }

    @Override
    public List<SysConfigDTO> listAll(SysConfigQuery query) {
        List<SysConfigPO> sysConfigPOS = sysConfigService.findPageByQuery(null, query);
        return sysConfigConvert.po2DTOList(sysConfigPOS);
    }

    @Override
    public SysConfigDTO getById(Long id) {
        SysConfig sysConfig = sysConfigService.getById(id);
        return sysConfigConvert.entity2DTO(sysConfig);
    }

    @Override
    public void saveOrUpdate(SysConfigDTO param) {
        //保存
        if (param.getId() == null) {
            if (ObjectUtil.isNotNull(sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(
                    SysConfig::getConfigKey, param.getConfigKey()).last(" limit 1")))) {
                throw new DaoException("唯一编码重复, 请检查");
            }
        } else {
            if (ObjectUtil.isNotNull(sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(
                    SysConfig::getConfigKey, param.getConfigKey()).ne(SysConfig::getId, param.getId()).last(" limit 1")))) {
                throw new DaoException("唯一编码重复, 请检查");
            }
        }
        param.setUpdateTime(LocalDateTime.now());
        param.setUpdater(Objects.requireNonNull(LoginUtil.getCurrentUser()).getUserId());
        sysConfigService.saveOrUpdate(sysConfigConvert.dto2Entity(param));
    }

    /**
     * 配置数据状态更新
     *
     * @param ids    配置数据的ID集合
     * @param status 变更的状态 0:启用 1:禁用
     * @return 结果
     */
    @Override
    public void updateStatus(String ids, Integer status) {
        final List<Long> idList = JSONArray.parseArray(ids, Long.class);
        List<SysConfig> dcList = Lists.newArrayList();
        for (Long id : idList) {
            SysConfig dc = new SysConfig();
            dc.setId(id);
            dc.setStatus(status);
            dcList.add(dc);
        }
        sysConfigService.updateBatchById(dcList);
    }

    @Override
    public void batchRemove(String ids) {
        final List<Long> idList = JSONArray.parseArray(ids, Long.class);
        List<SysConfig> dcList = Lists.newArrayList();
        for (Long id : idList) {
            SysConfig dc = new SysConfig();
            dc.setId(id);
            dc.setDeleteFlag(true);

            dcList.add(dc);
        }
        sysConfigService.updateBatchById(dcList);
    }

    /**
     * 获取文本型系统参数
     *
     * @param key 唯一编码
     * @return 参数
     */
    @Override
    public String getTextConfig(String key) {
        SysConfig sysConfigEntity = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getConfigKey,key).eq(SysConfig::getConfigType,1).last(" limit 1"));
        if (ObjectUtil.isEmpty(sysConfigEntity)){
            throw new DaoException("该系统参数不存在");
        }
        return sysConfigEntity.getConfigValue();
    }

    /**
     * 获取附件型文件
     *
     * @param key 唯一编码
     * @return 文件
     */
    @Override
    public FileResposeDTO getFileConfig(String key) {
        SysConfig sysConfigEntity = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getConfigKey,key).eq(SysConfig::getConfigType,3).last(" limit 1"));
        if (ObjectUtil.isEmpty(sysConfigEntity)){
            throw new DaoException("该系统参数不存在");
        }
        return fileLogic.getForDownload1(Long.valueOf(sysConfigEntity.getConfigValue()));
    }

    /**
     * 获取单选型系统参数
     *
     * @param key 唯一编码
     * @return 参数 0-否；1-是
     */
    @Override
    public Integer getRadioConfig(String key) {
        SysConfig sysConfigEntity = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getConfigKey,key).eq(SysConfig::getConfigType,2).last(" limit 1"));
        if (ObjectUtil.isEmpty(sysConfigEntity)){
            throw new DaoException("该系统参数不存在");
        }
        return Integer.valueOf(sysConfigEntity.getConfigValue());
    }
}
