package com.spring.common.util;

import java.util.Arrays;

import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class ProfileUtils {
    
    private final Environment environment;

    /**
     * 현재 활성화된 프로파일 목록을 반환합니다.
     *
     * @return 현재 활성화된 프로파일 배열
     */
    public String[] getActiveProfiles() {
        return environment.getActiveProfiles();
    }

    /**
     * 현재 프로파일이 'prod'인지 확인하는 메소드.
     *
     * @return true if the current profile is 'prod', false otherwise.
     */
    public boolean isProdProfile() {
        return isProfileActive("prod");
    }

    /**
     * 현재 프로파일이 'dev'인지 확인하는 메소드.
     *
     * @return true if the current profile is 'dev', false otherwise.
     */
    public boolean isDevProfile() {
        return isProfileActive("dev");
    }

    /**
     * 특정 프로파일이 활성화되어 있는지 확인하는 메소드.
     *
     * @param profile 확인할 프로파일 이름
     * @return true if the specified profile is active, false otherwise.
     */
    public boolean isProfileActive(String profile) {
        return Arrays.asList(environment.getActiveProfiles()).contains(profile);
    }

    /**
     * 현재 활성화된 프로파일이 여러 개일 경우, 그 중 하나라도 주어진 프로파일이 포함되어 있는지 확인하는 메소드.
     *
     * @param profiles 확인할 프로파일 이름 배열
     * @return true if any of the specified profiles are active, false otherwise.
     */
    public boolean isAnyProfileActive(String... profiles) {
        for (String profile : profiles) {
            if (isProfileActive(profile)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 현재 활성화된 프로파일 중 가장 우선순위가 높은 프로파일을 반환합니다.
     *
     * @return 가장 우선순위가 높은 프로파일 이름, 없으면 null
     */
    public String getHighestPriorityProfile() {
        String[] activeProfiles = getActiveProfiles();
        return activeProfiles.length > 0 ? activeProfiles[0] : null; // 첫 번째 프로파일이 가장 우선순위가 높다고 가정
    }

    /**
     * 기본 프로파일이 설정되어 있는지 확인하는 메소드.
     *
     * @return true if the default profile is active, false otherwise.
     */
    public boolean isDefaultProfileActive() {
        return isProfileActive("default");
    }

    /**
     * 주어진 프로파일이 활성화되어 있지 않은지 확인하는 메소드.
     *
     * @param profile 확인할 프로파일 이름
     * @return true if the specified profile is not active, false otherwise.
     */
    public boolean isProfileInactive(String profile) {
        return !isProfileActive(profile);
    }

}
