package com.ssyf.task.models;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 机器人执行缓存信息类
 * 用于记录机器人执行相关缓存信息
 */
@Data
@Accessors(chain = true)
public class RobotExecutionCacheInfo {
    /**
     * 机器人ID
     */
    private Long robotId;
    
    /**
     * 机器人账号
     */
    private String robotAccount;
    
    /**
     * 初次执行任务的时间（毫秒时间戳）
     */
    private Long firstExecutionTime;
    
    /**
     * 最后执行任务的时间（毫秒时间戳）
     */
    private Long lastExecutionTime;
    
    /**
     * 执行任务次数
     */
    private Integer executionCount;
    
    /**
     * 缓存创建时间（毫秒时间戳）
     */
    private Long createTime;
    
    /**
     * 缓存最后更新时间（毫秒时间戳）
     */
    private Long updateTime;
    
    /**
     * 默认构造函数
     */
    public RobotExecutionCacheInfo() {
        long currentTime = System.currentTimeMillis();
        this.createTime = currentTime;
        this.updateTime = currentTime;
        this.executionCount = 0;
    }
    
    /**
     * 带参数的构造函数
     * @param robotId 机器人ID
     * @param robotAccount 机器人账号
     */
    public RobotExecutionCacheInfo(Long robotId, String robotAccount) {
        this();
        this.robotId = robotId;
        this.robotAccount = robotAccount;
    }
    
    /**
     * 记录一次执行
     * @return 更新后的执行缓存信息
     */
    public RobotExecutionCacheInfo recordExecution() {
        long currentTime = System.currentTimeMillis();
        
        // 如果是第一次执行，设置初次执行时间
        if (this.firstExecutionTime == null) {
            this.firstExecutionTime = currentTime;
        }
        
        // 更新最后执行时间
        this.lastExecutionTime = currentTime;
        
        // 增加执行次数
        this.executionCount = (this.executionCount == null ? 1 : this.executionCount + 1);
        
        // 更新最后更新时间
        this.updateTime = currentTime;
        
        return this;
    }
    
    /**
     * 检查是否在指定时间内执行过
     * @param waitTimeMinutes 等待时间（分钟）
     * @return true表示在指定时间内执行过，false表示可以再次执行
     */
    public boolean hasExecutedRecently(int waitTimeMinutes) {
        if (this.lastExecutionTime == null) {
            return false;
        }
        
        long currentTime = System.currentTimeMillis();
        long waitTimeMillis = waitTimeMinutes * 60 * 1000L;
        
        return (currentTime - this.lastExecutionTime) < waitTimeMillis;
    }
    
    /**
     * 获取距离下次可执行的时间（毫秒）
     * @param waitTimeMinutes 等待时间（分钟）
     * @return 距离下次可执行的时间，如果为0或负数表示可以立即执行
     */
    public long getTimeToNextExecution(int waitTimeMinutes) {
        if (this.lastExecutionTime == null) {
            return 0;
        }
        
        long currentTime = System.currentTimeMillis();
        long waitTimeMillis = waitTimeMinutes * 60 * 1000L;
        long timeSinceLastExecution = currentTime - this.lastExecutionTime;
        
        return Math.max(0, waitTimeMillis - timeSinceLastExecution);
    }
    
    /**
     * 检查缓存信息是否有效
     * @return true表示有效，false表示无效
     */
    public boolean isValid() {
        return this.robotId != null && this.robotAccount != null;
    }
    
    @Override
    public String toString() {
        return "RobotExecutionCacheInfo{" +
                "robotId=" + robotId +
                ", robotAccount='" + robotAccount + '\'' +
                ", firstExecutionTime=" + firstExecutionTime +
                ", lastExecutionTime=" + lastExecutionTime +
                ", executionCount=" + executionCount +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                '}';
    }
}