/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.ai.taskInspection.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
import vip.xiaonuo.common.enums.CommonSortOrderEnum;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.page.CommonPageRequest;
import vip.xiaonuo.dev.modular.file.enums.DevFileEngineTypeEnum;
import vip.xiaonuo.dev.modular.file.service.DevFileService;
import vip.xiaonuo.modular.ai.dailyInspection.entity.DailyInspection;
import vip.xiaonuo.modular.ai.dailyInspection.mapper.DailyInspectionMapper;
import vip.xiaonuo.modular.ai.taskInspection.entity.TaskInspection;
import vip.xiaonuo.modular.ai.taskInspection.entity.vo.TaskInspectionDetailVo;
import vip.xiaonuo.modular.ai.taskInspection.entity.vo.TaskInspectionImageVo;
import vip.xiaonuo.modular.ai.taskInspection.entity.vo.TaskInspectionNumVo;
import vip.xiaonuo.modular.ai.taskInspection.entity.vo.TaskInspectionPageVo;
import vip.xiaonuo.modular.ai.taskInspection.mapper.TaskInspectionMapper;
import vip.xiaonuo.modular.ai.taskInspection.param.TaskInspectionAddParam;
import vip.xiaonuo.modular.ai.taskInspection.param.TaskInspectionEditParam;
import vip.xiaonuo.modular.ai.taskInspection.param.TaskInspectionIdParam;
import vip.xiaonuo.modular.ai.taskInspection.param.TaskInspectionPageParam;
import vip.xiaonuo.modular.ai.taskInspection.service.TaskInspectionService;
import vip.xiaonuo.modular.ai.warningRemind.entity.WarningRemind;
import vip.xiaonuo.modular.ai.warningRemind.mapper.WarningRemindMapper;
import vip.xiaonuo.modular.base.baseConfig.mapper.BaseConfigMapper;
import vip.xiaonuo.modular.bi.utils.UploadImage;
import vip.xiaonuo.modular.warning.warningInfo.entity.WarningInfo;
import vip.xiaonuo.modular.warning.warningInfo.mapper.WarningInfoMapper;

import javax.validation.constraints.NotBlank;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 任务巡检Service接口实现类
 *
 * @author newspaper
 * @date  2024/01/08 09:21
 **/
@Service
public class TaskInspectionServiceImpl extends ServiceImpl<TaskInspectionMapper, TaskInspection> implements TaskInspectionService {

    @Autowired
    private WarningRemindMapper warningRemindMapper;
    @Autowired
    private TaskInspectionMapper taskInspectionMapper;
    @Autowired
    private UploadImage uploadImage;
    @Autowired
    private WarningInfoMapper warningInfoMapper;
    @Autowired
    private BaseConfigMapper baseConfigMapper;
    @Autowired
    private DailyInspectionMapper dailyInspectionMapper;

    @Override
    public Page<TaskInspectionPageVo> page(TaskInspectionPageParam taskInspectionPageParam) {
        Integer status = taskInspectionPageParam.getStatus();
        String userId = StpLoginUserUtil.getLoginUser().getId();
        String orgId = taskInspectionPageParam.getOrgId();
        Page<TaskInspectionPageVo> taskInspectionPageVoPage = taskInspectionMapper.page(CommonPageRequest.defaultPage(), userId, status, orgId);
        return taskInspectionPageVoPage;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void edit(String id, String inspectTime, String inspectPersonId, String description, String noRemind, MultipartFile img1, MultipartFile img2, MultipartFile img3) throws IOException, ParseException {
        TaskInspection taskInspection = this.queryEntity(id);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        taskInspection.setInspectTime(dateFormat.parse(inspectTime));
        taskInspection.setInspectPersonId(inspectPersonId);
        taskInspection.setDescription(description);
        String imgUrl = "";
        if (ObjectUtil.isNotEmpty(img1)){
            if (!"上传失败".equals(uploadImage.getImageCom(img1))){
                imgUrl = uploadImage.getImageCom(img1);
            }else {
                throw new CommonException("图片上传失败!");
            }
        }
        if (ObjectUtil.isNotEmpty(img2)){
            if (!"上传失败".equals(uploadImage.getImageCom(img2))){
                imgUrl = imgUrl + "," + uploadImage.getImageCom(img2);
            }else {
                throw new CommonException("图片上传失败!");
            }
        }
        if (ObjectUtil.isNotEmpty(img3)){
            if (!"上传失败".equals(uploadImage.getImageCom(img3))){
                imgUrl = imgUrl + "," + uploadImage.getImageCom(img3);
            }else {
                throw new CommonException("图片上传失败!");
            }
        }
        taskInspection.setImgUrl(imgUrl);
        taskInspection.setStatus(1);
        this.updateById(taskInspection);

        WarningInfo warningInfo = warningInfoMapper.selectById(taskInspection.getWarningId());
        warningInfo.setWarningStatus(1);
        warningInfoMapper.updateById(warningInfo);

        if ("1".equals(noRemind)){

            String waringTypeId = baseConfigMapper.selectById(warningInfo.getWarningTypeId()).getId();
            WarningRemind warningRemind = warningRemindMapper.selectOne(new QueryWrapper<WarningRemind>().lambda()
                    .eq(WarningRemind::getOrgId, taskInspection.getOrgId())
                    .eq(WarningRemind::getUnitId, warningInfo.getUnitId())
                    .eq(WarningRemind::getWarningTypeId, waringTypeId));
            if (ObjectUtil.isNotEmpty(warningRemind)){
                warningRemind.setTodayNoRemind(1);
                warningRemindMapper.updateById(warningRemind);
            }else {
                warningRemind = new WarningRemind();
                warningRemind.setOrgId(taskInspection.getOrgId());
                warningRemind.setUnitId(warningInfo.getUnitId());
                warningRemind.setWarningTypeId(waringTypeId);
                warningRemind.setTodayNoRemind(1);
                warningRemindMapper.insert(warningRemind);
            }
        }
    }

    @Override
    public TaskInspectionImageVo detail(TaskInspectionIdParam taskInspectionIdParam) {
        String id = taskInspectionIdParam.getId();
        TaskInspectionImageVo taskInspectionImageVo = new TaskInspectionImageVo();
        TaskInspectionPageVo taskInspectionPageVo = taskInspectionMapper.detail(id);
        BeanUtil.copyProperties(taskInspectionPageVo,taskInspectionImageVo);
        if (ObjectUtil.isNotEmpty(taskInspectionPageVo.getImgUrl())){
            taskInspectionImageVo.setPages(taskInspectionPageVo.getImgUrl().split(","));
        }
        return taskInspectionImageVo;
    }

    @Override
    public TaskInspectionNumVo getNum() {
        String id = StpLoginUserUtil.getLoginUser().getId();
        TaskInspectionNumVo inspectionNum = new TaskInspectionNumVo();
        Long taskNum = taskInspectionMapper.selectCount(new QueryWrapper<TaskInspection>().lambda().eq(TaskInspection::getStatus, 0).eq(TaskInspection::getNotifierId, id));
        Long dailyNum = dailyInspectionMapper.selectCount(new QueryWrapper<DailyInspection>().lambda().eq(DailyInspection::getStatus, 0).eq(DailyInspection::getNotifierId, id));
        inspectionNum.setTaskNum(taskNum);
        inspectionNum.setDailyNum(dailyNum);
        Long count = taskInspectionMapper.selectCount(new QueryWrapper<TaskInspection>().lambda().eq(TaskInspection::getStatus, 1).eq(TaskInspection::getNotifierId, id));
        Long count1 = dailyInspectionMapper.selectCount(new QueryWrapper<DailyInspection>().lambda().eq(DailyInspection::getStatus, 1).eq(DailyInspection::getNotifierId, id));
        inspectionNum.setHistoryNum(count+count1);
        return inspectionNum;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<TaskInspectionIdParam> taskInspectionIdParamList) {
        // 执行删除
        this.removeByIds(CollStreamUtil.toList(taskInspectionIdParamList, TaskInspectionIdParam::getId));
    }

    @Override
    public TaskInspection queryEntity(String id) {
        TaskInspection taskInspection = this.getById(id);
        if(ObjectUtil.isEmpty(taskInspection)) {
            throw new CommonException("任务巡检不存在，id值为：{}", id);
        }
        return taskInspection;
    }


}
