package com.ssyf.module.robot.helper;

import com.ssyf.module.robot.domain.entity.RConfigRelation;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 配置关系时间有效性判断工具类
 */
@Slf4j
public class ConfigTimeHelper {
    
    /**
     * 判断配置关系是否在有效时间内（使用当前时间判断）
     * @param configRelation 配置关系实体
     * @return 是否在有效时间范围内
     */
    public static boolean isInValidTime(RConfigRelation configRelation) {
        int currentHour = LocalTime.now().getHour();
        return isInValidTime(configRelation, currentHour);
    }
    
    /**
     * 判断配置关系是否在有效时间内（使用指定时间数值判断）
     * @param configRelation 配置关系实体
     * @param hourValue 指定的小时数值（24小时制）
     * @return 是否在有效时间范围内
     */
    public static boolean isInValidTime(RConfigRelation configRelation, int hourValue) {
        // 验证小时数值范围
        if (hourValue < 0 || hourValue > 24) {
            log.warn("传入的小时数值 {} 超出有效范围 [0-24]", hourValue);
            return false;
        }
        
        // 检查默认的开始结束时间
        if (isInRange(configRelation.getStartTime(), configRelation.getEndTime(), hourValue)) {
            return true;
        }
        
        // 检查额外的5组时间范围
        if (isInRange(configRelation.getStartTime1(), configRelation.getEndTime1(), hourValue)) {
            return true;
        }
        
        if (isInRange(configRelation.getStartTime2(), configRelation.getEndTime2(), hourValue)) {
            return true;
        }
        
        if (isInRange(configRelation.getStartTime3(), configRelation.getEndTime3(), hourValue)) {
            return true;
        }
        
        if (isInRange(configRelation.getStartTime4(), configRelation.getEndTime4(), hourValue)) {
            return true;
        }
        
        if (isInRange(configRelation.getStartTime5(), configRelation.getEndTime5(), hourValue)) {
            return true;
        }
        
        return false;
    }
    
    /**
     * 判断配置关系是否在有效时间内（使用LocalDateTime对象判断）
     * @param configRelation 配置关系实体
     * @param dateTime 指定的时间
     * @return 是否在有效时间范围内
     */
    public static boolean isInValidTime(RConfigRelation configRelation, LocalDateTime dateTime) {
        if (dateTime == null) {
            log.warn("传入的时间对象为null");
            return false;
        }
        
        int hourValue = dateTime.getHour();
        return isInValidTime(configRelation, hourValue);
    }
    
    /**
     * 检查指定小时是否在给定的时间范围内
     * 支持跨天时间范围（例如：22点到6点）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param hourValue 要检查的小时值
     * @return 是否在范围内
     */
    private static boolean isInRange(Integer startTime, Integer endTime, int hourValue) {
        // 如果开始时间或结束时间为null，则不考虑这个时间段
        if (startTime == null || endTime == null) {
            return false;
        }
        
        // 验证时间范围的有效性
        if (startTime < 0 || startTime > 24 || endTime < 0 || endTime > 24) {
            log.warn("时间范围无效: 开始时间={}, 结束时间={}", startTime, endTime);
            return false;
        }
        
        // 普通时间段（如 9点到18点）
        if (startTime <= endTime) {
            return hourValue >= startTime && hourValue <= endTime;
        } 
        // 跨天时间段（如 22点到6点）
        else {
            return hourValue >= startTime || hourValue <= endTime;
        }
    }
}
