package com.bonus.material.warning;

import cn.hutool.json.JSONObject;
import com.ah.sbd.SmsTool;
import com.ah.sbd.utils.param.SmsParam;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.bonus.common.biz.constant.BmConfigItems;
import com.bonus.common.core.utils.StringUtils;
import com.bonus.common.core.utils.sms.SmsUtils;
import com.bonus.material.back.domain.BackApplyInfo;
import com.bonus.material.back.mapper.BackApplyInfoMapper;
import com.bonus.material.back.service.IBackApplyInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 任务定时推送相关人员任务控制器
 * @author ma_sh
 */
@Component
@Slf4j
public class ScheduledTasks {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Resource
    private BackApplyInfoMapper backApplyInfoMapper;

    @Resource
    private ScheduledTaskRegistrar scheduledTaskRegistrar;

    /**
     * 定时任务执行频率，每3天上午9点执行一次
     */
    private String cronExpression = "0 0 9 */3 * ?";

    /**
     * 初始化定时任务
     */
    @PostConstruct
    public void init() {
        cronExpression = getCronFromDatabase();
        updateCronTask();
    }

    /**
     * 更新定时任务
     */
    private void updateCronTask() {
        scheduledTaskRegistrar.getScheduler().schedule(() -> {
            taskWithFixedRate();
        }, new CronTrigger(cronExpression));
    }

    /**
     * 从数据库中获取 cron 表达式
     * @return
     */
    private String getCronFromDatabase() {
        // 这里假设从数据库中获取 cron 表达式
        //return "0 */1 * * * ?";
        return "0 0 9 */3 * ?";
    }

    /**
     * 退料人未签字三天推送一次给李勇
     * 每三天的上午9点执行
     */
    public void taskWithFixedRate() {
        log.info("开始执行退料人未签字任务");
        BackApplyInfo info = new BackApplyInfo();
        List<BackApplyInfo> list = backApplyInfoMapper.selectBackApplyInfoList(info);
        // 用于标记是否有 BackSignUrl 为 null 的记录
        boolean hasNullBackSignUrl = false;
        if (CollectionUtils.isNotEmpty(list)) {
            // 遍历列表，检查每个 BackApplyInfo 的 BackSignUrl 是否为空
            for (BackApplyInfo backApplyInfo : list) {
                if (StringUtils.isBlank(backApplyInfo.getBackSignUrl())) {
                    hasNullBackSignUrl = true;
                    break;
                }
            }
        }
        if (hasNullBackSignUrl) {
            // 统一发送一条短信
            String phoneNumber = "15527030643";
            String content = "您好，李勇！您还有退料单未签字，请及时登录系统查看处理，感谢配合！";
            // 发送短信
            try {
                //String sendResult = SmsUtils.smsToken(phoneNumber, content, "");
                // 省公司短信发送
                JSONObject sendResult = SmsTool.sendSms(new SmsParam(phoneNumber, content), BmConfigItems.ANHUI_COMPANY_SMS_KEY);
                if (sendResult != null && !sendResult.isEmpty()) {
                    log.info("短信发送成功: {}", sendResult);
                    System.out.println("短信发送成功: " + sendResult);
                } else {
                    log.error("短信发送失败，发送结果为空!");
                    System.out.println("短信发送失败，发送结果为空!");
                }
            } catch (Exception e) {
                log.error("短信发送过程中发生异常: {}", e.getMessage());
                System.out.println("短信发送过程中发生异常: " + e.getMessage());
            }
        } else {
            log.info("没有未签字的退料单");
            System.out.println("没有未签字的退料单");
        }
         // 记录任务执行时间
        log.info("退料人未签字任务执行时间：" + LocalDateTime.now().format(FORMATTER));
        System.out.println("退料人未签字任务执行时间：" + LocalDateTime.now().format(FORMATTER));
    }

}