package dev.awesomedev.mirim.repository;

import dev.awesomedev.mirim.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

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

/**
 * 이 파일이 하는 일:
 * User 엔티티의 DB 접근을 담당하는 Spring Data JPA 리포지토리다.
 *
 * 학습 포인트: 인터페이스만 선언하면 Spring Data JPA가 구현체를 자동으로 만들어 준다.
 * findByUsername처럼 메서드 이름 규칙만 지키면 SQL을 직접 쓰지 않아도 된다.
 * (예: existsByUsername → SELECT EXISTS(... WHERE username = ?) 같은 쿼리가 자동 생성된다)
 */
public interface UserRepository extends JpaRepository<User, Long> {

    /** 로그인 아이디로 사용자 조회. 없을 수 있으므로 Optional로 감싼다. */
    Optional<User> findByUsername(String username);

    /**
     * 아이디 중복 확인 (회원가입용).
     * 학습 포인트: findByUsername(...).isPresent()로도 되지만, exists 쿼리는
     * 행 전체를 가져오지 않고 "있는지 없는지"만 물어서 DB 입장에서 더 가볍다.
     */
    boolean existsByUsername(String username);

    /** 이름으로 사용자 목록 조회 (아이디 찾기용). 동명이인이 있을 수 있어 List로 받는다. */
    List<User> findByName(String name);

    /** 아이디와 이름이 모두 일치하는 사용자 조회 (비밀번호 재설정의 본인 확인용). */
    Optional<User> findByUsernameAndName(String username, String name);

    /** 역할별 사용자 목록, 이름순 (멘토 페이지의 학생 진도 조회용). */
    List<User> findByRoleOrderByNameAsc(String role);
}
