package com.kt.event.content.infra.gateway.repository;

import com.kt.event.content.biz.domain.ImageStyle;
import com.kt.event.content.biz.domain.Platform;
import com.kt.event.content.infra.gateway.entity.GeneratedImageEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

/**
 * 생성된 이미지 JPA 리포지토리
 */
public interface GeneratedImageJpaRepository extends JpaRepository<GeneratedImageEntity, Long> {

    /**
     * 이벤트 초안 ID로 이미지 목록 조회
     *
     * @param eventDraftId 이벤트 초안 ID
     * @return 이미지 엔티티 목록
     */
    List<GeneratedImageEntity> findByEventDraftId(Long eventDraftId);

    /**
     * 이벤트 초안 ID와 스타일로 이미지 목록 조회
     *
     * @param eventDraftId 이벤트 초안 ID
     * @param style        이미지 스타일
     * @return 이미지 엔티티 목록
     */
    List<GeneratedImageEntity> findByEventDraftIdAndStyle(Long eventDraftId, ImageStyle style);

    /**
     * 이벤트 초안 ID와 플랫폼으로 이미지 목록 조회
     *
     * @param eventDraftId 이벤트 초안 ID
     * @param platform     플랫폼
     * @return 이미지 엔티티 목록
     */
    List<GeneratedImageEntity> findByEventDraftIdAndPlatform(Long eventDraftId, Platform platform);

    /**
     * 이벤트 초안 ID와 선택 여부로 이미지 목록 조회
     *
     * @param eventDraftId 이벤트 초안 ID
     * @param selected     선택 여부
     * @return 이미지 엔티티 목록
     */
    List<GeneratedImageEntity> findByEventDraftIdAndSelected(Long eventDraftId, boolean selected);

    /**
     * 이벤트 초안 ID로 선택된 이미지 목록 조회
     *
     * @param eventDraftId 이벤트 초안 ID
     * @return 선택된 이미지 엔티티 목록
     */
    @Query("SELECT i FROM GeneratedImageEntity i WHERE i.eventDraftId = :eventDraftId AND i.selected = true")
    List<GeneratedImageEntity> findSelectedImages(@Param("eventDraftId") Long eventDraftId);

    /**
     * 이벤트 초안 ID로 모든 이미지 선택 해제
     *
     * @param eventDraftId 이벤트 초안 ID
     */
    @Query("UPDATE GeneratedImageEntity i SET i.selected = false WHERE i.eventDraftId = :eventDraftId")
    void deselectAllByEventDraftId(@Param("eventDraftId") Long eventDraftId);
}
