package com.unicorn.hgzero.meeting.infra.gateway.repository;

import com.unicorn.hgzero.meeting.infra.gateway.entity.MeetingEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 회의 JPA Repository
 */
@Repository
public interface MeetingJpaRepository extends JpaRepository<MeetingEntity, String> {

    /**
     * 주최자 ID로 회의 목록 조회
     */
    List<MeetingEntity> findByOrganizerId(String organizerId);

    /**
     * 상태로 회의 목록 조회
     */
    List<MeetingEntity> findByStatus(String status);

    /**
     * 주최자 ID와 상태로 회의 목록 조회
     */
    List<MeetingEntity> findByOrganizerIdAndStatus(String organizerId, String status);

    /**
     * 일정 시간 범위로 회의 목록 조회
     */
    List<MeetingEntity> findByScheduledAtBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 템플릿 ID로 회의 목록 조회
     */
    List<MeetingEntity> findByTemplateId(String templateId);

    /**
     * 주최자의 특정 시간대 중복 회의 개수 조회
     * 회의 상태가 SCHEDULED 또는 IN_PROGRESS이고,
     * 시간이 겹치는 회의가 있는지 확인
     *
     * @param organizerId 주최자 ID
     * @param startTime 회의 시작 시간
     * @param endTime 회의 종료 시간
     * @return 중복 회의 개수
     */
    @org.springframework.data.jpa.repository.Query(
        "SELECT COUNT(m) FROM MeetingEntity m WHERE " +
        "m.organizerId = :organizerId AND " +
        "m.status IN ('SCHEDULED', 'IN_PROGRESS') AND " +
        "((m.scheduledAt < :endTime AND m.endTime > :startTime))"
    )
    long countConflictingMeetings(
        @org.springframework.data.repository.query.Param("organizerId") String organizerId,
        @org.springframework.data.repository.query.Param("startTime") LocalDateTime startTime,
        @org.springframework.data.repository.query.Param("endTime") LocalDateTime endTime
    );
}
