package com.eactive.eai.rms.common.util;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;

/**
 * IP 주소 관련 유틸리티 클래스
 *
 * 프록시(OHS, WebLogic 등)를 통해 들어온 요청의 실제 클라이언트 IP를 추출합니다.
 */
public class IpUtil {

	/**
	 * HttpServletRequest에서 실제 클라이언트 IP를 추출합니다.
	 * 프록시(OHS, WebLogic 등)를 통해 들어온 요청의 경우 프록시 헤더를 확인하여 실제 클라이언트 IP를 반환합니다.
	 *
	 * 확인하는 헤더 순서:
	 * 1. X-Forwarded-For (가장 일반적인 프록시 헤더)
	 * 2. Proxy-Client-IP
	 * 3. WL-Proxy-Client-IP (WebLogic 전용 헤더)
	 * 4. HTTP_X_FORWARDED_FOR
	 * 5. request.getRemoteAddr() (fallback)
	 *
	 * @param request HttpServletRequest 객체
	 * @return 실제 클라이언트 IP 주소
	 */
	public static String getClientIp(HttpServletRequest request) {
		if (request == null) {
			return "unknown";
		}

		String ip = request.getHeader("X-Forwarded-For");

		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}

		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}

		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
		}

		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}

		// X-Forwarded-For 헤더에 여러 IP가 쉼표로 구분되어 있을 경우 첫 번째 IP만 사용
		if (ip != null && ip.indexOf(",") > 0) {
			ip = ip.substring(0, ip.indexOf(",")).trim();
		}

		return ip;
	}

	/**
	 * IP 주소가 유효한 IPv4 형식인지 검증합니다.
	 *
	 * @param ip 검증할 IP 주소
	 * @return 유효한 IPv4 형식이면 true, 아니면 false
	 */
	public static boolean isValidIp(String ip) {
		if (StringUtils.isBlank(ip)) {
			return false;
		}

		String ipPattern = "(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}";
		return ip.matches(ipPattern);
	}
}
