package com.docus.server.service.impl;

import com.docus.core.util.Func;
import com.docus.core.util.property.Setters;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.infrastructure.web.request.SearchDTO;
import com.docus.infrastructure.web.response.PageResult;
import com.docus.server.common.netty.server.TerminalToChannelCacheMap;
import com.docus.server.convert.SchTerminatorConvert;
import com.docus.server.dto.scheduling.management.schterminator.AddSchTerminatorDTO;
import com.docus.server.dto.scheduling.management.schterminator.DeleteSchTerminatorDTO;
import com.docus.server.dto.scheduling.management.schterminator.EditSchTerminatorDTO;
import com.docus.server.dto.scheduling.management.schterminator.NettyTerminatorDTO;
import com.docus.server.entity.scheduling.management.SchTerminator;
import com.docus.server.enums.BusyStateEnum;
import com.docus.server.infrastructure.dao.ISchTerminatorDao;
import com.docus.server.service.ISchTerminatorService;
import com.docus.server.vo.scheduling.management.schterminator.SchTerminatorVO;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 执行管理器 服务实现类
 *
 * @author AutoGenerator
 * @since 2023-07-15
 */
@Service
public class SchTerminatorServiceImpl implements ISchTerminatorService {
    @Resource
    private ISchTerminatorDao iSchTerminatorDao;
    @Resource
    private IdService idService;
    @Resource
    private TerminalToChannelCacheMap terminalToChannelCacheMap;

    /**
     * 按主键查询
     *
     * @param id 主键Id
     * @return 实体
     */
    @Override
    public SchTerminatorVO findById(String id) {
        return SchTerminatorConvert.INSTANCE.convertVO(iSchTerminatorDao.findById(id));
    }

    /**
     * 关键字搜索
     *
     * @param searchDTO 搜索参数
     * @return 分页列表
     */
    @Override
    public PageResult<SchTerminatorVO> search(SearchDTO searchDTO) {
        PageResult<SchTerminatorVO> result = SchTerminatorConvert.INSTANCE.convertVO(iSchTerminatorDao.search(searchDTO));

        if (CollectionUtils.isEmpty(result.getList())) {
            return new PageResult<>();
        }

        Map<String, NettyTerminatorDTO> ipToTerminatorCacheMap = terminalToChannelCacheMap.getIpToTerminatorCacheMap();

        Setters.<SchTerminatorVO>instance().list(result.getList()).cycleSetProperties(p -> {
            String terminatorIp = String.valueOf(p.getTerminatorIp());
            if (ipToTerminatorCacheMap.containsKey(terminatorIp)) {
                NettyTerminatorDTO nettyTerminatorDTO = ipToTerminatorCacheMap.get(terminatorIp);
                p.setLoadSchCollectorVOList(nettyTerminatorDTO.getLoadSchCollectorVOList());
            }
        });

        return result;
    }

    @Override
    public SchTerminatorVO saveOrUpdate(String terminatorIp, NettyTerminatorDTO nettyTerminatorDTO) {

        SchTerminator schTerminator = iSchTerminatorDao.findOneBy("terminatorIp", terminatorIp);

        //新增
        if (Func.isNull(schTerminator)) {
            SchTerminator schTerminatorDO = new SchTerminator();

            schTerminatorDO.setId(idService.getDateSeq());
            schTerminatorDO.setTerminatorIp(terminatorIp);
            schTerminatorDO.setTerminatorName(terminatorIp);
            schTerminatorDO.setOnlineState(nettyTerminatorDTO.getOnlineState());
            schTerminatorDO.setBusyState(BusyStateEnum.IDLE);

            iSchTerminatorDao.save(schTerminatorDO);

            return SchTerminatorConvert.INSTANCE.convertVO(schTerminatorDO);
        } else {
            //更新
            schTerminator.setBusyState(nettyTerminatorDTO.getBusyState());
            schTerminator.setOnlineState(nettyTerminatorDTO.getOnlineState());
            schTerminator.setUpdateTime(new Date());

            iSchTerminatorDao.updateById(schTerminator);

            return SchTerminatorConvert.INSTANCE.convertVO(schTerminator);
        }

    }

    @Override
    public List<SchTerminator> findAll() {
        return iSchTerminatorDao.findAll();
    }

    @Override
    public void batchUpdate(List<SchTerminator> terminators) {
        iSchTerminatorDao.updateBatchById(terminators, 20);
    }

    @Override
    public SchTerminatorVO findByTerminalIP(String terminalIp) {
        SchTerminator schTerminator = iSchTerminatorDao.findOneBy("terminatorIp", terminalIp);
        return SchTerminatorConvert.INSTANCE.convertVO(schTerminator);
    }

    /**
     * 新增
     *
     * @param addSchTerminatorDTO 编辑参数
     * @return 成功或失败
     */
    @Override
    public boolean add(AddSchTerminatorDTO addSchTerminatorDTO) {
        SchTerminator schTerminator = SchTerminatorConvert.INSTANCE.convertDO(addSchTerminatorDTO);
        return iSchTerminatorDao.add(schTerminator);
    }

    /**
     * 编辑
     *
     * @param editSchTerminatorDTO 编辑参数
     * @return 成功或失败
     */
    @Override
    public boolean edit(EditSchTerminatorDTO editSchTerminatorDTO) {
        Long id = editSchTerminatorDTO.getId();
        SchTerminator schTerminatorDO = iSchTerminatorDao.findById(id);
        SchTerminator schTerminator = SchTerminatorConvert.INSTANCE.convertDO(editSchTerminatorDTO, schTerminatorDO);
        return iSchTerminatorDao.edit(schTerminator);
    }

    /**
     * 批量删除
     *
     * @param deleteSchTerminatorDTO 删除参数
     * @return 成功或失败
     */
    @Override
    public int delete(DeleteSchTerminatorDTO deleteSchTerminatorDTO) {
        return iSchTerminatorDao.delete(deleteSchTerminatorDTO.getIds());
    }
}

