package com.unicorn.hgzero.notification.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

/**
 * 재시도 정책 설정
 *
 * Spring Retry를 사용한 재시도 메커니즘 구성
 * 이메일 발송 실패 시 Exponential Backoff 전략 적용
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Slf4j
@Configuration
@EnableRetry
public class RetryConfig {

    /**
     * RetryTemplate Bean 생성
     *
     * 재시도 정책:
     * - 최대 3번 재시도
     * - Exponential Backoff: 초기 5분, 최대 30분, 배수 2.0
     *
     * @return 구성된 RetryTemplate
     */
    @Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate retryTemplate = new RetryTemplate();

        // 재시도 정책: 최대 3번
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(3);

        // Backoff 정책: Exponential Backoff
        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
        backOffPolicy.setInitialInterval(300000);  // 5분
        backOffPolicy.setMaxInterval(1800000);     // 30분
        backOffPolicy.setMultiplier(2.0);          // 배수

        retryTemplate.setRetryPolicy(retryPolicy);
        retryTemplate.setBackOffPolicy(backOffPolicy);

        log.info("RetryTemplate 생성 완료 - MaxAttempts: 3, InitialInterval: 5분, MaxInterval: 30분, Multiplier: 2.0");

        return retryTemplate;
    }
}
