/**
#                                                    __----~~~~~~~~~~~------___
#                                   .  .   ~~//====......          __--~ ~~
#                   -.            \_|//     |||\\  ~~~~~~::::... /~
#                ___-==_       _-~o~  \/    |||  \\            _/~~-
#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
#          '         ~-|      /|    |-~\~~       __--~~
#                      |-~~-_/ |    |   ~\_   _-~            /\
#                           /  \     \__   \/~                \__
#                       _--~ _/ | .-~~____--~-/                  ~~==.
#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
#                                 -_     ~\      ~~---l__i__i__i--~~_/
#                                 _-~-__   ~)  \--______________--~~
#                               //.-~~~-~_--~- |-------~~~~~~~~
#                                      //.-~~~--\
#                  神兽保佑
#                  永无BUG!
*/
package com.nanjing.water.service;

import com.nanjing.water.common.*;
import com.nanjing.water.common.enums.*;
import com.nanjing.water.common.model.Tuple;
import com.nanjing.water.common.util.*;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
import com.nanjing.water.repository.impl.HeartbeatDataMapperImpl;
import com.nanjing.water.repository.po.HeartbeatDataPO;
import com.nanjing.water.entity.request.heartbeatdata.ReqCreateHeartbeatData;
import com.nanjing.water.entity.request.heartbeatdata.ReqModifyHeartbeatData;
import com.nanjing.water.entity.search.SearchHeartbeatData;
import com.nanjing.water.repository.vo.HeartbeatDataVO;
import com.nanjing.water.service.convert.HeartbeatDataConvert;

/**
 * HeartbeatData
 * @author lin.liu
 */
@Service
public class HeartbeatDataService extends BaseService {
    @Autowired
    private HeartbeatDataMapperImpl mapper;

    public ExecutedResult<Long> create(ReqCreateHeartbeatData request) {
        // 转换po
        HeartbeatDataPO item = HeartbeatDataConvert.INSTANCE.toCreate(request);
        // 设置状态
        //item.setStatus(EState.NORMAL.getValue());
        // 设置记录创建时间
        item.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
        // 是否删除(逻辑删除)初始值
        item.setIsDelete(EYesOrNo.NO.getValue());

        int rowCount = mapper.insert(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("创建[null]失败。");
        }
        return ExecutedResult.success(item.getId());
    }

    public ExecutedResult<String> modify(ReqModifyHeartbeatData request) {
        // 验证记录是否存在
        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(request.getId());
        if (checkExists.isFailed()) {
            return ExecutedResult.failed(checkExists.getMsg());
        }
        // 转换po
        HeartbeatDataPO item = HeartbeatDataConvert.INSTANCE.toModify(request);

        int rowCount = mapper.updateById(item);
        if (rowCount != 1) {
            return ExecutedResult.failed("编辑[null]失败。");
        }
        return ExecutedResult.success();
    }

    public ExecutedResult<HeartbeatDataVO> get(Long id) {
        HeartbeatDataVO result = new HeartbeatDataVO();

        HeartbeatDataPO find = mapper.get(id);
        if (null != find) {
            // 转换vo
            result = HeartbeatDataConvert.INSTANCE.toVo(find);
        }
        return ExecutedResult.success(result);
    }
    public ExecutedResult<HeartbeatDataVO> getByCode(){
        HeartbeatDataVO vo=new HeartbeatDataVO();
        HeartbeatDataPO heartbeatUp = mapper.getByCode("heartbeat_up");
        if(Objects.nonNull(heartbeatUp)){
            vo = HeartbeatDataConvert.INSTANCE.toVo(heartbeatUp);
        }
        return ExecutedResult.success(vo);
    }
//    public ExecutedResult<String> stop(Long id) {
//        // 验证记录是否存在
//        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(id);
//        if (checkExists.isFailed()) {
//            return ExecutedResult.failed(checkExists.getMsg());
//        }
//        HeartbeatDataPO item = new HeartbeatDataPO();
//        item.setId(id);
//        item.setStatus(EState.DISABLED.getValue());
//
//        int rowCount = mapper.updateById(item);
//        if (rowCount != 1) {
//           return ExecutedResult.failed("停用[null]失败。");
//       }
//       return ExecutedResult.success();
//   }
//
//    public ExecutedResult<String> enable(Long id) {
//        // 验证记录是否存在
//        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(id);
//        if (checkExists.isFailed()) {
//            return ExecutedResult.failed(checkExists.getMsg());
//        }
//        HeartbeatDataPO item = new HeartbeatDataPO();
//        item.setId(id);
//        item.setStatus(EState.NORMAL.getValue());
//
//        int rowCount = mapper.updateById(item);
//        if (rowCount != 1) {
//            return ExecutedResult.failed("启用[null]失败。");
//        }
//        return ExecutedResult.success();
//    }
//
//    public ExecutedResult<String> setSort(ReqSetSort request) {
//        // 验证记录是否存在
//        ExecutedResult<HeartbeatDataPO> checkExists = this.check4Id(request.getId());
//        if (checkExists.isFailed()) {
//            return ExecutedResult.failed(checkExists.getMsg());
//        }
//        HeartbeatDataPO item = new HeartbeatDataPO();
//        item.setId(request.getId());
//        item.setSort(request.getSort());
//
//        int rowCount = mapper.updateById(item);
//        if (rowCount != 1) {
//            return ExecutedResult.failed("设置[null]排序值失败。");
//        }
//        return ExecutedResult.success();
//    }
//
//    public ExecutedResult<String> listSetSort(ReqListSetSort request) {
//        // id列表
//        List<Long> listId = request.getList().stream().map(ReqSetSort::getId).collect(Collectors.toList());
//        // 验证记录是否存在
//        ExecutedResult<List<HeartbeatDataPO>> checkExists = this.check4Id(listId);
//        if (checkExists.isFailed()) {
//            return ExecutedResult.failed(checkExists.getMsg());
//        }
//
//        List<HeartbeatDataPO> listUpdate = request.getList().stream()
//                .map(c -> {
//                    HeartbeatDataPO item = new HeartbeatDataPO();
//                    item.setId(c.getId());
//                    item.setSort(c.getSort());
//                    return item;
//                })
//                .collect(Collectors.toList());
//        Boolean result = mapper.modifyList(listUpdate);
//        if (result) {
//            return ExecutedResult.success();
//        }
//        return ExecutedResult.failed("[null]设置排序值失败");
//    }
//
//    public ExecutedResult<String> remove(Long id) {
//        Boolean result = mapper.deleteLogic(id);
//        if (BooleanUtils.isFalse(result)) {
//            return ExecutedResult.failed("删除[null]失败。");
//        }
//        return ExecutedResult.success();
//    }
//
//    public ExecutedResult<String> removeList(List<Long> ids) {
//        Boolean result = mapper.deleteLogic(ids);
//        if (BooleanUtils.isFalse(result)) {
//            return ExecutedResult.failed("删除[null]失败。");
//        }
//        return ExecutedResult.success();
//    }

    public ExecutedResult<List<HeartbeatDataVO>> getList(List<Long> listId) {
        List<HeartbeatDataVO> result = new ArrayList<>();

        List<HeartbeatDataPO> list = mapper.getList(listId);
        if (ListUtil.isNotNullOrEmpty(list)) {
            // 转换vo
            result = HeartbeatDataConvert.INSTANCE.toVo(list);
        }
        return ExecutedResult.success(result);
    }

    public ExecutedResult<PagerResult<HeartbeatDataVO>> search(SearchHeartbeatData search) {
        // 处理创建时间范围-查询参数
        Tuple<String, String> createTimeRange = ParameterUtil.getTimeRange(search.getCreateTimeRange());
        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem1())) {
            search.setCreateTimeStart(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem1()).getTime());
        }
        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem2())) {
            search.setCreateTimeEnd(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem2()).getTime());
        }

        PagerResult<HeartbeatDataPO> pageList = mapper.search(search);
        List<HeartbeatDataVO> listVo = new ArrayList<>();
        List<HeartbeatDataPO> list = pageList.getList();
        if (ListUtil.isNotNullOrEmpty(list)) {
            pageList.setLastId(list.get(list.size() - 1).getId());
            // 转换vo
            listVo = HeartbeatDataConvert.INSTANCE.toVo(list);
        }
        PagerResult<HeartbeatDataVO> result = new PagerResult<>(pageList.getLimit(), pageList.getPage(), pageList.getTotal(), listVo);
        result.setLastId(pageList.getLastId());
        return ExecutedResult.success(result);
    }

    protected ExecutedResult<HeartbeatDataPO> check4Id(Long id) {
        HeartbeatDataPO exists = mapper.get(id);
        if (Objects.isNull(exists)) {
            return ExecutedResult.failed("[null]不存在:" + id);
        }
        return ExecutedResult.success(exists);
    }
    protected ExecutedResult<List<HeartbeatDataPO>> check4Id(List<Long> listId) {
        // 从数据库查找null
        List<HeartbeatDataPO> list = mapper.getList(listId);
        if (ListUtil.isNullOrEmpty(list)) {
            return ExecutedResult.failed("[null]不存在." + listId);
        }
        // 数据库找到的id列表
        List<Long> listIdFind = list.stream().map(HeartbeatDataPO::getId).collect(Collectors.toList());
        // 数量不一致
        if (listId.size() != listIdFind.size()) {
            // 筛选数据库不存在的null
            List<Long> listIdNotFound = listId.stream().filter(c -> !listIdFind.contains(c)).collect(Collectors.toList());
            if (ListUtil.isNullOrEmpty(list)) {
                return ExecutedResult.failed("[null]不存在." + listIdNotFound);
            }
        }
        return ExecutedResult.success(list);
    }}