package com.unicorn.hgzero.notification.event.processor;

import com.azure.messaging.eventhubs.EventProcessorClient;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

/**
 * Event Processor 라이프사이클 관리 서비스
 *
 * EventProcessorClient의 시작과 종료를 관리
 * 애플리케이션 시작 시 이벤트 수신 시작, 종료 시 안전하게 정리
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Slf4j
@Service
@RequiredArgsConstructor
@ConditionalOnProperty(
    name = "azure.eventhub.enabled",
    havingValue = "true",
    matchIfMissing = false
)
public class EventProcessorService {

    private final EventProcessorClient eventProcessorClient;

    /**
     * 애플리케이션 시작 시 Event Processor 시작
     *
     * @throws Exception 시작 실패 시 예외 발생
     */
    @PostConstruct
    @Retryable(
        maxAttempts = 3,
        backoff = @Backoff(delay = 2000, multiplier = 2.0)
    )
    public void start() throws Exception {
        try {
            log.info("Event Processor 시작 중...");
            eventProcessorClient.start();
            log.info("Event Processor 시작 완료");
        } catch (Exception e) {
            log.error("Event Processor 시작 실패", e);
            throw e;
        }
    }

    /**
     * 애플리케이션 종료 시 Event Processor 정리
     *
     * 처리 중인 이벤트를 안전하게 완료하고 리소스 정리
     */
    @PreDestroy
    public void stop() {
        try {
            log.info("Event Processor 종료 중...");
            eventProcessorClient.stop();
            log.info("Event Processor 종료 완료");
        } catch (Exception e) {
            log.error("Event Processor 종료 중 오류 발생", e);
        }
    }
}
