package com.takensoft.common.util;

import org.springframework.stereotype.Component;

import jakarta.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

@Component
public class CommonUtils {

    // 사용자 아이피 주소
    public String getIp(HttpServletRequest req) throws UnknownHostException {
        String ip = req.getHeader("X-Forwarded-For");

        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("WL-Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("HTTP_CLIENT_IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("X-Real-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("X-RealIP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getHeader("REMOTE_ADDR");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = req.getRemoteAddr();
        }

        if(ip.equals("0:0:0:0:0:0:0:1") || ip.equals("127.0.0.1") || ip.equals("::1")) {
            InetAddress adr = InetAddress.getLocalHost();
            ip = adr.getHostAddress();
//            ip = adr.getHostName() + "/" + adr.getHostAddress();
        } else if (ip.startsWith("::ffff:")) {
            ip = ip.substring(7); // ::ffff:를 제거하고 IPv4 주소만 추출
        }

        return ip;
    }

    // HTTP 요청에서 User-Agent 해더 추출
    public static String getUserAgent(HttpServletRequest req) {
        return req.getHeader("User-Agent");
    }

    // 운영체제 정보 추출
    public static String getOS(String userAgent) {
        String os = "Unknown";

        // userAgent 문자열에서 운영체제 정보 추출
        if(userAgent != null && !userAgent.isEmpty()) {
            if(userAgent.toLowerCase().contains("windows")) {
                os = "Windows";
            } else if(userAgent.toLowerCase().contains("mac")) {
                os = "Mac";
            } else if(userAgent.toLowerCase().contains("linux")) {
                os = "Linux";
            }
        }
        return os;
    }

    // 디바이스 정보 추출
    public static String getDevice(String userAgent) {
        String device = "Unknown";
        // userAgent 문자열에서 디바이스 정보 추출
        if(userAgent != null && !userAgent.isEmpty()) {
            if(userAgent.toLowerCase().contains("mobile")) {
                device = "Mobile";
            } else {
                device = "Desktop";
            }
        }
        return device;
    }

    // 브라우저 정보 추출
    public static String getBrowser(String userAgent) {
        String browser = "Unknown";
        // userAgent 문자열에서 브라우저저 정보추출
        if(userAgent != null && !userAgent.isEmpty()) {
            if(userAgent.toLowerCase().contains("msie")) {
                browser = "Internet Explorer";
            } else if(userAgent.toLowerCase().contains("firefox")) {
                browser = "Firefox";
            } else if(userAgent.toLowerCase().contains("chrome")) {
                browser = "Chrome";
            } else if(userAgent.toLowerCase().contains("safari")) {
                browser = "Safari";
            } else if(userAgent.toLowerCase().contains("edge")) {
                browser = "Edge";
            }
        }
        return browser;
    }
}
