package egovframework.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

/**
 * Utility class for URL pattern matching
 */
@Slf4j
public class PathMatcherUtil {

    private static final AntPathMatcher pathMatcher = new AntPathMatcher();

    /**
     * Check if URL pattern matches the request URI
     * 
     * @param pattern URL pattern
     * @param uri Request URI
     * @return true if matches, false otherwise
     */
    /**
     * URL 패턴이 URI와 일치하는지 확인
     * 콤마로 구분된 여러 패턴이 전달된 경우 각 패턴을 개별적으로 처리
     * 
     * @param pattern URL 패턴 (콤마로 구분된 여러 패턴일 수 있음)
     * @param uri 요청 URI
     * @return 일치 여부
     */
    public static boolean match(String pattern, String uri) {
        if (pattern == null || uri == null) {
            return false;
        }
        
        // 패턴 전처리 - 앞뒤 공백 제거
        String trimmedPattern = pattern.trim();
        
        // 패턴에 콤마가 포함된 경우 (여러 패턴이 하나의 문자열로 전달된 경우)
        if (trimmedPattern.contains(",")) {
            //log.debug("콤마로 구분된 여러 패턴이 발견되었습니다: [{}]", trimmedPattern);
            
            // 콤마로 패턴을 분리하여 각각 처리
            String[] patterns = trimmedPattern.split(",");
            for (String singlePattern : patterns) {
                String trimmedSinglePattern = singlePattern.trim();
                if (!trimmedSinglePattern.isEmpty()) {
                    // 개별 패턴으로 재귀 호출
                    if (match(trimmedSinglePattern, uri)) {
                        return true;
                    }
                }
            }
            return false;
        }
        
        // 단일 패턴 처리
        try {
            // AntPathMatcher는 패턴에 따라 다르게 동작함
            // 1. 정확한 경로 매칭 (/system/user/list.do)
            // 2. 경로 변수 매칭 (/system/user/{id}.do)
            // 3. 와일드카드 매칭 (/system/user/*.do, /system/user/**/list.do)
            boolean isMatch = pathMatcher.match(trimmedPattern, uri);
            //log.debug("URL 패턴 매칭 시도: 패턴=[{}], URI=[{}], 결과=[{}]", trimmedPattern, uri, isMatch);
            
            // 매칭되지 않았을 경우 추가 디버깅 정보
            if (!isMatch && (trimmedPattern.contains("*") || trimmedPattern.contains("?"))) {
                //log.debug("와일드카드 패턴 매칭 실패: 패턴=[{}], URI=[{}]", trimmedPattern, uri);
            }
            
            return isMatch;
        } catch (Exception e) {
            log.error("URL 패턴 매칭 중 오류 발생: 패턴=[{}], URI=[{}], 오류=[{}]", trimmedPattern, uri, e.getMessage(), e);
            return false;
        }
    }
}