package com.yfd.platform.modules.experimentalData.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.modules.experimentalData.domain.TsTask;
import com.yfd.platform.modules.experimentalData.mapper.TsTaskMapper;
import com.yfd.platform.modules.experimentalData.service.ITsFilesService;
import com.yfd.platform.modules.experimentalData.service.ITsNodesService;
import com.yfd.platform.modules.experimentalData.service.ITsTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.utils.StringUtils;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 试验任务表 服务实现类
 * </p>
 *
 * @author LiMengNan
 * @since 2025-01-21
 */
@Service
public class TsTaskServiceImpl extends ServiceImpl<TsTaskMapper, TsTask> implements ITsTaskService {

    private static final Logger LOGGER = LoggerFactory.getLogger(ChannelInboundHandlerAdapter.class);


    //试验任务Mapper
    @Resource
    private TsTaskMapper tsTaskMapper;

    //实验数据管理
    @Resource
    private ITsNodesService tsNodesService;

    /**********************************
     * 用途说明: 分页查询试验数据管理-试验任务管理
     * 参数说明
     * taskName      任务名称
     * startDate     (开始日期)
     * endDate      （结束日期）
     * taskPlace     任务地点
     * taskPerson    任务人员
     * carrierType   载体类型
     * deviceCode    设备
     * pageNum 当前页
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果
     ***********************************/
    @Override
    public Page<TsTask> getTsTaskPage(String taskName, String startDate, String endDate, String taskPlace, String taskPerson, String carrierType, String deviceCode, Page<TsTask> page) {

        LambdaQueryWrapper<TsTask> queryWrapper = new LambdaQueryWrapper<>();
        //如果任务名称    taskName 不为空
        if (StringUtils.isNotEmpty(taskName)) {
            queryWrapper.like(TsTask::getTaskName, taskName);
        }

        //如果任务地点   taskPlace 不为空
        if (StringUtils.isNotEmpty(taskPlace)) {
            queryWrapper.like(TsTask::getTaskPlace, taskPlace);
        }

        //如果任务人员  taskPerson 不为空
        if (StringUtils.isNotEmpty(taskPerson)) {
            queryWrapper.like(TsTask::getTaskPerson, taskPerson);
        }

        //如果操作类型  carrierType 不为空
        if (StringUtils.isNotEmpty(carrierType)) {
            queryWrapper.like(TsTask::getCarrierType, carrierType);
        }

        //如果设备  deviceCode 不为空
        if (StringUtils.isNotEmpty(deviceCode)) {
            queryWrapper.like(TsTask::getDeviceCode, deviceCode);
        }

        //开始时间startDate
        DateTime parseStartDate = DateUtil.parse(startDate);
        //时间endDate不为空
        DateTime parseEndDate = DateUtil.parse(endDate);
        //开始时间和结束时间不为空    查询条件>=开始时间  <结束时间
        if (parseStartDate != null && parseEndDate != null) {
            queryWrapper.ge(TsTask::getTaskDate, parseStartDate).lt(TsTask::getTaskDate, parseEndDate);
        }
        //分页查询
        Page<TsTask> tsTaskPage = tsTaskMapper.selectPage(page, queryWrapper);
        return tsTaskPage;
    }

    /***********************************
     * 用途说明：新增试验数据管理-试验任务管理
     * 参数说明
     * TsTask     试验任务管理
     * 返回值说明:  com.yfd.platform.config.ResponseResult 返回新增成功或者失败
     ***********************************/
    @Override
    public Boolean addSdproject(TsTask tsTask) {
        // 设置当前时间
        LocalDateTime now = LocalDateTime.now();
        // 转换为 Timestamp
        Timestamp currentTime = Timestamp.valueOf(now);
        tsTask.setCreateTime(currentTime);
        int valueAdded = tsTaskMapper.insert(tsTask);
        if (valueAdded == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**********************************
     * 用途说明: 修改试验数据管理-试验任务管理
     * 参数说明
     * TsTask     试验任务管理
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回修改成功或者失败
     ***********************************/
    @Override
    public boolean updatetsTask(TsTask tsTask) {
        int valueUpdate = tsTaskMapper.updateById(tsTask);
        if (valueUpdate == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**********************************
     * 用途说明: 批量删除试验数据管理-试验任务管理
     * 参数说明  ids 试验数据管理id数组
     * 返回值说明: com.yfd.platform.config.ResponseResult 返回批量删除成功或失败
     ***********************************/
    @Override
    public boolean deleteTstaskByIds(List<String> dataset) {
        Boolean value = false;

        //循环所有的ID
        for(String taskId : dataset){
            //调用删除节点 根据任务ID
            Boolean deleteTsnodes  =   tsNodesService.deleteTsNodesByTaskId(taskId);
            //如果删除成功 接着删除节点表数据
            if(deleteTsnodes){
                LOGGER.info("tsNodes表结删除改成功");
                value = true;
            }else {
                LOGGER.error("tsNodes表结构删除失败");
                value = false;
            }

            int deleteCount = tsTaskMapper.deleteById(taskId);
            if (deleteCount == 1) {
                LOGGER.info("tstask表结删除改成功");
                value = true;
            } else {
                LOGGER.error("tstask表结构删除失败");
                value = false;
            }
        }

        return value;
    }
}
