package com.bio.bio_backend.domain.user.member.repository;

import com.bio.bio_backend.domain.user.member.entity.Member;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Optional;

/**
 * QueryDSL을 활용한 커스텀 쿼리 메서드들을 정의하는 인터페이스
 * 복잡한 쿼리나 동적 쿼리가 필요한 경우 이 인터페이스를 구현하여 사용합니다.
 */
public interface MemberRepositoryCustom {

    /**
     * 사용자 ID로 회원을 조회합니다.
     * QueryDSL을 사용하여 더 유연한 쿼리 작성이 가능합니다.
     *
     * @param userId 사용자 ID
     * @return Optional<Member> 회원 정보 (없으면 empty)
     */
    Optional<Member> findByUserIdCustom(String userId);

    /**
     * 역할(Role)별로 회원 목록을 조회합니다.
     *
     * @param role 회원 역할
     * @return List<Member> 해당 역할을 가진 회원 목록
     */
    List<Member> findByRole(String role);

    /**
     * 사용 여부별로 회원 목록을 조회합니다.
     *
     * @param useFlag 사용 여부
     * @return List<Member> 해당 사용 여부를 가진 회원 목록
     */
    List<Member> findByUseFlag(Boolean useFlag);

    /**
     * 사용자 ID와 사용 여부로 회원을 조회합니다.
     *
     * @param userId 사용자 ID
     * @param useFlag 사용 여부
     * @return Optional<Member> 회원 정보
     */
    Optional<Member> findByUserIdAndUseFlag(String userId, Boolean useFlag);

    /**
     * 검색 조건에 따른 회원 목록을 페이징하여 조회합니다.
     *
     * @param userId 사용자 ID (부분 검색)
     * @param role 회원 역할
     * @param useFlag 사용 여부
     * @param pageable 페이징 정보
     * @return Page<Member> 페이징된 회원 목록
     */
    Page<Member> findMembersByCondition(String userId, String role, Boolean useFlag, Pageable pageable);

    /**
     * 마지막 로그인 시간이 특정 시간 이후인 회원들을 조회합니다.
     *
     * @param lastLoginAfter 마지막 로그인 기준 시간
     * @return List<Member> 해당 조건을 만족하는 회원 목록
     */
    List<Member> findActiveMembersByLastLogin(java.time.LocalDateTime lastLoginAfter);
}
