package incheon.uis.ums.util;


import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;


/**
 * Class Provider
 */
@Slf4j
@Component
@Lazy(false)
public class UisApplicationContextProvider implements ApplicationContextAware {
    
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext ctx) {
        applicationContext = ctx;
    }

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    // 제너릭 타입 메서드 - 빈 네임, 타입으로 가져오기
    public <T> T getBean(String beanName, Class<T> clazz) {
    	log.debug("beanName : {}", beanName);
    	// snake_case를 PascalCase로 변환// 카멜케이스가 아닐 때만 변환 (언더스코어나 하이픈이 포함된 경우)
        if (beanName.contains("_") || beanName.contains("-")) {
        	beanName = convertToCamelCase(beanName);
        	log.debug("변환된 beanName : {}", beanName);
        }
        
        return applicationContext.getBean(beanName, clazz);
    }

    // 제너릭 타입 메서드 - 타입으로 가져오기
    public <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
    
    /**
     * snake_case를 camelCase로 변환
     * 예: cmt_cnst_d_mapper -> cmtCnstDMapper
     */
    private String convertToCamelCase(String snakeCase) {
        if (snakeCase == null || snakeCase.isEmpty()) {
            return snakeCase;
        }
        
        StringBuilder result = new StringBuilder();
        String[] parts = snakeCase.split("_");
        
        for (int i = 0; i < parts.length; i++) {
            String part = parts[i];
            if (part.isEmpty()) continue;
            
            if (i == 0) {
                // 첫 번째 단어는 모두 소문자로
                result.append(part.toLowerCase());
            } else {
                // 이미 대문자로 시작하는 경우 (Mapper, Service 등) 원본 유지
                if (Character.isUpperCase(part.charAt(0))) {
                    result.append(part);
                } else {
                    // 소문자로 시작하면 첫 글자만 대문자로, 나머지는 그대로
                    result.append(Character.toUpperCase(part.charAt(0)));
                    if (part.length() > 1) {
                        result.append(part.substring(1));
                    }
                }
            }
        }
        
        return result.toString();
    }
}