package com.devjob.event;

import com.devjob.domain.Application;
import com.devjob.domain.Job;
import com.devjob.domain.Member;
import com.devjob.email.EmailService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

/**
 * EP44: ApplicationSubmittedEvent 구독자.
 *
 * - @TransactionalEventListener(phase = AFTER_COMMIT): 지원 저장 트랜잭션이 "커밋된 이후"에만 실행된다.
 *   만약 일반 @EventListener를 쓰면 같은 트랜잭션 안에서 실행되므로, 이메일 발송 중 예외가 나면
 *   원본 지원(Application) 저장까지 롤백되는 부작용이 생길 수 있다. AFTER_COMMIT으로 이를 방지한다.
 * - 이메일 발송 자체는 EmailService 내부에서 @Async로 실행되므로(EP26),
 *   여기서 예외가 나더라도 이미 커밋된 지원 데이터에는 영향이 없다.
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ApplicationEventListener {

    private final EmailService emailService;

    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void onApplicationSubmitted(ApplicationSubmittedEvent event) {
        Application application = event.application();
        Member member = application.getMember();
        Job job = application.getJob();

        log.debug("지원 완료 이벤트 수신: applicationId={}, memberId={}", application.getId(), member.getId());
        emailService.sendApplicationCompletedEmail(member.getEmail(), job.getTitle(), job.getCompany().getName());
    }
}
