package com.app.util;

import java.util.Locale;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

import org.springframework.context.MessageSource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.util.StringUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * 웹 관련 유틸 클래스
 * 
 * @author STEVE
 */
@Slf4j
public class WebUtil {

    /**
     * 현재 request url 에서 [http(s)프로토콜 부터 도메인까지]를 substring 한 문자열을 리턴한다.
     * 	
     * 	- PDF에 링크가 존재할 경우, 브라우저 호출이 가능하도록 하기 위해서 작성한 메서드
     *  - 최초 SharedService 에 작성하려고 했었으나, HttpServletRequest 에 대한 dependencies 가 존재하지 않아서 그냥 간단한 유틸로 작성함.
     */
    public static String getUrlPrefix(HttpServletRequest request) {
        
        return request.getRequestURL().toString().replaceAll("^(https?:\\/\\/)(.+?)(\\/.*)$", "$1$2");
    }	
    
    /**
     * 특정 프로퍼티의 값을 static way로 조회/리턴
     * 
     * 	- Spring DI 를 사용할 수 없을 경우에 사용한다.
     * 	- File I/O가 발생할 수 있으므로 퍼포먼스가 중요한 로직에는 사용하지 말 것.
     * 
     * @param name
     * @return
     */
    public static String getProperty(String name) {

        String ret = "";
        try {
            Resource resource = new ClassPathResource("/META-INF/spring/dataweb-infra.properties");
            Properties props = PropertiesLoaderUtils.loadProperties(resource);
            ret = props.getProperty(name);		
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }

    /**
     * context root 의 물리경로 반환
     * 
     * @param request
     * @return
     */
    public static String getCtxRootPath(HttpServletRequest request) {
        
        return request.getServletContext().getRealPath("/");
    }

    /**
     * 현재 WAS가 로컬서버인지 운영서버인지 판단하여 구분값을 리턴
     * 
     * @return
     */
    public static String getServerType() {
        
        return StringUtil.isBlank(System.getProperty("proxy.server")) ? "LOCAL" : "PRD";
    }

    /**
     * 모바일기기로부터 온 요청일 경우 true, 아니면 false 리턴
     * 
     * @param request
     * @return
     */
    public static boolean isMobileRequest(HttpServletRequest request) {
        
        String userAgent = StringUtil.trim(request.getHeader("user-agent"));
        log.debug("## userAgent: [{}]", userAgent);
        return userAgent.contains("Mobi"); // 'Mobi'를 식별자로 사용 
    }

    /**
     * HttpServletRequest를 static way로 획득
     * 
     * @return
     */
    public static HttpServletRequest getCurrentHttpRequest(){
        
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes instanceof ServletRequestAttributes) {
            HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
            return request;
        }
        log.debug("HttpReqest가 존재하지 않는 context 에서 getCurrentHttpRequest()가 호출되었습니다.");
        
        return null;
    }	
    
    /**
     * request parameter 'lang'을 찾아서 Locale 객체를 생성/리턴한다.
     * 
     * @return
     */
    public static Locale getRequestLocale() {
        
    	String lang = WebUtil.getCurrentHttpRequest().getParameter("lang");
    	lang = StringUtil.isNotBlank(lang) ? lang : "ko"; // 기본값 ko
    	return new Locale(lang);
    }
    
    /**
     * MessageSource 를 static way로 획득
     * 
     * @return
     */
    public static MessageSource getMessageSource() {
        return ContextProvider.getBean(MessageSource.class);		
    }
    
    /**
     * application-messages*.properties 파일의 문자열 획득
     * 
     * @param msgCode
     * @param args
     * @return
     */
    public static String getMessage(String msgCode, Object[] args) {
        return getMessageSource().getMessage(msgCode, args, getRequestLocale());
    }
    public static String getMessage(String msgCode) {
        return getMessage(msgCode, null);
    }
    
}