package com.njcn.msgpush.module.push.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.time.LocalDateTime;

/**
 * @author caozehui
 * @date 2026-02-27
 * @description 消息重试策略枚举
 */
@Getter
@AllArgsConstructor
public enum RetryStrategyEnum {

    /**
     * 固定间隔重试
     */
    FIXED_INTERVAL(1, "固定间隔重试") {
        @Override
        public LocalDateTime calculateNextRetryTime(int retryCount, int intervalSeconds) {
            return LocalDateTime.now().plusSeconds(intervalSeconds);
        }
    },

    /**
     * 指数退避重试
     */
    EXPONENTIAL_BACKOFF(2, "指数退避重试") {
        @Override
        public LocalDateTime calculateNextRetryTime(int retryCount, int baseIntervalSeconds) {
            // 基础间隔 * 2^重试次数，最大不超过1小时
            long delay = Math.min(baseIntervalSeconds * (1L << retryCount), 3600);
            return LocalDateTime.now().plusSeconds(delay);
        }
    };

    /**
     * 自定义时间重试
     */
//    CUSTOM(3, "自定义时间重试") {
//        @Override
//        public LocalDateTime calculateNextRetryTime(int retryCount, int unused) {
//
//            return LocalDateTime.now().plusMinutes(5 * retryCount);
//        }
//    };

    private Integer code;
    private String description;

    /**
     * 计算下次重试时间
     *
     * @param retryCount 当前重试次数
     * @param param 参数（根据策略不同含义不同）
     * @return 下次重试时间
     */
    public abstract LocalDateTime calculateNextRetryTime(int retryCount, int param);

    public static RetryStrategyEnum fromCode(Integer code) {
        for (RetryStrategyEnum strategy : values()) {
            if (strategy.getCode().equals(code)) {
                return strategy;
            }
        }
        return FIXED_INTERVAL; // 默认返回固定间隔
    }
}
