package com.kt.distribution.repository;

import com.kt.distribution.entity.DistributionStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Optional;

/**
 * 배포 상태 JPA Repository
 *
 * 배포 상태를 데이터베이스에 영구 저장하고 조회합니다.
 *
 * @author Backend Developer
 * @since 2025-10-24
 */
@Repository
public interface DistributionStatusJpaRepository extends JpaRepository<DistributionStatus, Long> {

    /**
     * 이벤트 ID로 배포 상태 조회
     *
     * @param eventId 이벤트 ID
     * @return 배포 상태 (없으면 Optional.empty())
     */
    Optional<DistributionStatus> findByEventId(String eventId);

    /**
     * 이벤트 ID로 배포 상태 조회 (채널 상태 Fetch Join)
     *
     * @param eventId 이벤트 ID
     * @return 배포 상태 (채널 상태 포함, 없으면 Optional.empty())
     */
    @Query("SELECT d FROM DistributionStatus d LEFT JOIN FETCH d.channels WHERE d.eventId = :eventId")
    Optional<DistributionStatus> findByEventIdWithChannels(@Param("eventId") String eventId);

    /**
     * 이벤트 ID로 배포 상태 존재 여부 확인
     *
     * @param eventId 이벤트 ID
     * @return 존재 여부
     */
    boolean existsByEventId(String eventId);

    /**
     * 이벤트 ID로 배포 상태 삭제
     *
     * @param eventId 이벤트 ID
     */
    void deleteByEventId(String eventId);
}
