package com.zioinfo.kintex.cms;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * M17 CMS 예약 게시 트리거 — Spring {@code @Scheduled} DB 폴러.
 *
 * <p>Redis 지연 큐 대신 <b>DB 폴러</b>를 채택했다: 단일 노드 전제에서 더 단순·결정적이며, 재기동 시 예약이
 * 유실되지 않는다(예약 시각은 {@code cms_content.scheduled_at} 에 영속). 폴러는 30초 주기로
 * {@link CmsService#runScheduledPublish()} 를 호출하며, 실제 전이(상태 조건 UPDATE·버전 스냅샷·감사 로그)는
 * 서비스가 <b>수동 게시와 동일한 경로</b>로 수행한다.
 *
 * <p>{@code @Scheduled} 전역 활성화는 기존 {@code WebhookSchedulingConfig(@EnableScheduling)} 가 담당한다.
 * 스윕 예외는 조용히 흡수하고 다음 주기에 재시도한다(스택트레이스·민감정보 미노출).
 */
@Component
public class CmsScheduledPublisher {

    private static final Logger log = LoggerFactory.getLogger(CmsScheduledPublisher.class);

    private final CmsService cmsService;

    public CmsScheduledPublisher(CmsService cmsService) {
        this.cmsService = cmsService;
    }

    /** 예약 게시 폴러 — 기동 30초 후 최초 실행, 이후 30초 고정 지연(이전 스윕 종료 기준). */
    @Scheduled(initialDelay = 30_000, fixedDelay = 30_000)
    public void sweep() {
        try {
            int published = cmsService.runScheduledPublish();
            if (published > 0) {
                log.info("M17 CMS 예약 게시 자동 전이 {}건", published);
            }
        } catch (Exception e) {
            log.warn("M17 CMS 예약 게시 스윕 실패: {}", e.getClass().getSimpleName());
        }
    }
}
