package com.devjob.scheduler;

import com.devjob.domain.Job;
import com.devjob.domain.JobStatus;
import com.devjob.repository.JobRepository;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 * EP31: 마감일이 지난 공고를 매일 자정 자동으로 CLOSED 처리한다.
 * - cron = "초 분 시 일 월 요일" 순서. "0 0 0 * * *"는 매일 00:00:00.
 * - changeStatus()로 영속 엔티티의 필드를 바꾸면, 트랜잭션 커밋 시 변경 감지(dirty checking)로
 *   UPDATE 쿼리가 일괄 반영된다 (별도의 save() 호출 불필요).
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class JobScheduler {

    private final JobRepository jobRepository;

    @Scheduled(cron = "0 0 0 * * *")
    @Transactional
    public void closeExpiredJobs() {
        List<Job> expired = jobRepository.findByStatusAndDeadlineBefore(JobStatus.OPEN, LocalDate.now());

        expired.forEach(job -> job.changeStatus(JobStatus.CLOSED));

        log.info("[Scheduler] 마감일 경과 공고 {}건 자동 마감 처리 완료", expired.size());
    }

    // 테스트용 — 30초마다 실행하고 싶을 때:
    // @Scheduled(fixedDelay = 30000)
}
