package com.bio.bio_backend.domain.admin.common_code.repository;

import com.bio.bio_backend.domain.admin.common_code.dto.GetCommonCodeResponseDto;
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
import java.util.List;
import java.util.Optional;

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

    /**
     * 그룹 코드로 활성화된 공통 코드들을 정렬 순서대로 조회합니다.
     *
     * @param groupCode 그룹 코드
     * @return List<CommonCode> 활성화된 공통 코드 목록
     */
    List<CommonCode> findByGroupCode(String groupCode);

    /**
     * 부모 코드로 활성화된 공통 코드들을 정렬 순서대로 조회합니다.
     *
     * @param parentCode 부모 코드
     * @return List<CommonCode> 활성화된 공통 코드 목록
     */
    List<CommonCode> findByParentCode(String parentCode);

    /**
     * 특정 공통 코드를 조회하며 CommonGroupCode와 Member 정보를 join하여 함께 조회합니다.
     * QueryDSL을 사용하여 성능 최적화된 쿼리를 실행합니다.
     *
     * @param code 조회할 공통 코드
     * @return Optional<GetCommonCodeResponseDto> 조회된 공통 코드 정보 (없으면 empty)
     */
    Optional<GetCommonCodeResponseDto> findCodeWithJoinInfo(String code);

    /**
     * 특정 공통 코드를 조회하며 CommonGroupCode와 Member 정보를 join하여 함께 조회합니다.
     * Native Query를 사용한 버전 (사용하지 않음, 참고용)
     *
     * @param code 조회할 공통 코드
     * @return Optional<GetCommonCodeResponseDto> 조회된 공통 코드 정보 (없으면 empty)
     */
    Optional<GetCommonCodeResponseDto> findCodeWithJoinInfoNative(String code);
}