package com.unicorn.hgzero.notification.repository;

import com.unicorn.hgzero.notification.domain.NotificationSetting;
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.List;
import java.util.Optional;

/**
 * 알림 설정 Repository
 *
 * 사용자별 알림 설정 관리
 * 채널 활성화, 알림 유형, 방해 금지 시간대 설정
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Repository
public interface NotificationSettingRepository extends JpaRepository<NotificationSetting, String> {

    /**
     * 사용자 ID로 알림 설정 조회
     *
     * userId가 PK이므로 findById(userId)와 동일하지만 명시적인 메서드명 제공
     *
     * @param userId 사용자 ID
     * @return 알림 설정 (없으면 empty)
     */
    Optional<NotificationSetting> findByUserId(String userId);

    /**
     * 사용자 ID 존재 여부 확인
     *
     * @param userId 사용자 ID
     * @return 존재 여부
     */
    boolean existsByUserId(String userId);

    /**
     * 이메일 알림 활성화된 사용자 목록 조회
     *
     * @param emailEnabled 이메일 알림 활성화 여부
     * @return 알림 설정 목록
     */
    List<NotificationSetting> findByEmailEnabled(boolean emailEnabled);

    /**
     * SMS 알림 활성화된 사용자 목록 조회
     *
     * @param smsEnabled SMS 알림 활성화 여부
     * @return 알림 설정 목록
     */
    List<NotificationSetting> findBySmsEnabled(boolean smsEnabled);

    /**
     * Push 알림 활성화된 사용자 목록 조회
     *
     * @param pushEnabled Push 알림 활성화 여부
     * @return 알림 설정 목록
     */
    List<NotificationSetting> findByPushEnabled(boolean pushEnabled);

    /**
     * 방해 금지 모드 활성화된 사용자 목록 조회
     *
     * @param dndEnabled 방해 금지 모드 활성화 여부
     * @return 알림 설정 목록
     */
    List<NotificationSetting> findByDndEnabled(boolean dndEnabled);

    /**
     * 특정 알림 유형이 활성화된 사용자 개수 조회 (통계용)
     *
     * 예: 회의 초대 알림을 활성화한 사용자 수
     *
     * @param invitationEnabled 회의 초대 알림 활성화 여부
     * @return 사용자 개수
     */
    long countByInvitationEnabled(boolean invitationEnabled);

    /**
     * Todo 할당 알림이 활성화된 사용자 개수 조회 (통계용)
     *
     * @param todoAssignedEnabled Todo 할당 알림 활성화 여부
     * @return 사용자 개수
     */
    long countByTodoAssignedEnabled(boolean todoAssignedEnabled);

    /**
     * 이메일과 특정 알림 유형이 모두 활성화된 사용자 조회
     *
     * 발송 대상 필터링용
     *
     * @param emailEnabled 이메일 알림 활성화 여부
     * @param invitationEnabled 회의 초대 알림 활성화 여부
     * @return 알림 설정 목록
     */
    List<NotificationSetting> findByEmailEnabledAndInvitationEnabled(
        boolean emailEnabled,
        boolean invitationEnabled
    );

    /**
     * 이메일과 Todo 할당 알림이 모두 활성화된 사용자 조회
     *
     * @param emailEnabled 이메일 알림 활성화 여부
     * @param todoAssignedEnabled Todo 할당 알림 활성화 여부
     * @return 알림 설정 목록
     */
    List<NotificationSetting> findByEmailEnabledAndTodoAssignedEnabled(
        boolean emailEnabled,
        boolean todoAssignedEnabled
    );

    /**
     * 모든 알림 채널이 비활성화된 사용자 조회 (모니터링용)
     *
     * @param emailEnabled 이메일 알림 활성화 여부
     * @param smsEnabled SMS 알림 활성화 여부
     * @param pushEnabled Push 알림 활성화 여부
     * @return 알림 설정 목록
     */
    @Query("SELECT ns FROM NotificationSetting ns WHERE ns.emailEnabled = :emailEnabled AND ns.smsEnabled = :smsEnabled AND ns.pushEnabled = :pushEnabled")
    List<NotificationSetting> findUsersWithAllChannelsDisabled(
        @Param("emailEnabled") boolean emailEnabled,
        @Param("smsEnabled") boolean smsEnabled,
        @Param("pushEnabled") boolean pushEnabled
    );
}
