package dev.awesomedev.mirim.repository;

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

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

/**
 * 이 파일이 하는 일: student_profile 테이블의 DB 접근 창구.
 */
public interface StudentProfileRepository extends JpaRepository<StudentProfile, Long> {

    /** 회사 이메일 아이디 중복 확인 (가입 시). */
    boolean existsByCompanyEmailLocal(String companyEmailLocal);

    /** 특정 사용자의 프로필. */
    Optional<StudentProfile> findByUser(User user);

    /**
     * 전체 프로필을 User까지 함께 가져온다 (멘토 명단·CSV용).
     *
     * 학습 포인트 — JOIN FETCH는 왜 필요한가?
     * StudentProfile.user는 LAZY(필요할 때 따로 조회)다. 그런데 명단을 만들 때
     * 프로필마다 user의 이름·트랙이 필요하다. 그냥 findAll로 가져오면,
     * 나중에 p.getUser()를 부르는 순간 SELECT가 또 나가는데(N+1), 그 시점이
     * 트랜잭션 밖이면 "no session" 에러로 터진다(open-in-view: false라서).
     * JOIN FETCH는 "프로필 조회할 때 user도 한 번에 JOIN해서 가져와라"는 지시다.
     * → 한 번의 쿼리로 다 채워오니 N+1도, LazyInitializationException도 없다.
     * (이 함정은 Progress·Submission 엔티티 주석에서도 반복 등장한다 — 그만큼 흔하다.)
     */
    @Query("SELECT p FROM StudentProfile p JOIN FETCH p.user ORDER BY p.id ASC")
    List<StudentProfile> findAllWithUser();
}
