package com.udapsoft.waf.system.context;

import java.util.Enumeration;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.hsnc.common.util.ValueObject;
import kr.co.hsnc.j2ee.waf.controller.web.context.AbstractSessionContext;
import kr.co.hsnc.j2ee.waf.controller.web.util.WebKeys;

import com.udapsoft.waf.system.HandlerStorage;
import com.udapsoft.waf.system.ParameterParser;

public class SessionContext extends AbstractSessionContext {

	private static final long serialVersionUID = 2397955132580073793L;
	private HttpServletRequest request;

	/**
	 * 초기화
	 */
	public void init(HttpServletRequest request, HttpServletResponse response) {
		super.init(request, response);
		this.request = request;

		/**
		 * 브라우저 Cache Expire 시키기
		 */
		if (request.getProtocol().compareTo("HTTP/1.0") == 0) {
			response.setHeader("Pragma", "no-cache");
		} else if (request.getProtocol().compareTo("HTTP/1.1") == 0) {
			response.setHeader("Cache-Control", "no-cache");
		}
		response.setDateHeader("Expires", 0);
	}

	/**
	 * 요청에 대한 처리를 한다.
	 */
	public void processRequest(HttpServletRequest request,
			HttpServletResponse response) {
	}

	/**
	 * 사용자의 로그인 여부를 리턴한다.
	 * 
	 * @return 로그인 여부
	 */
	public boolean isSignedOn() {
		ValueObject user = getUser();
		if (user != null && user.size() < 1) {
			return false;
		} else {
			return true;
		}
	}

	/**
	 * 세션에 로그인 사용자의 정보를 저장한다.
	 */
	public void setUser(ValueObject user) {
		bind("USER", user);
	}

	/**
	 * 세션에 저장해둔 로그인 사용자의 정보를 얻어온다.
	 */
	public ValueObject getUser() {
		ValueObject user = (ValueObject) lookup(WebKeys.SIGNED_ON_USER);
		if (user == null) {
			user = new ValueObject();
		}
		return user;
	}

	/**
	 * request에 담겨온 파라메터를 얻는다.
	 * 
	 * @return ValueObject
	 */
	public ValueObject getParams() {
		return getParams(false);
	}

	/**
	 * request에 담겨온 파라메터를 얻는다.
	 * 
	 * @return ValueObject
	 */
	public ValueObject getParams(boolean isCaseSensitive) {
		ParameterParser parameterParser = new ParameterParser(this.request);
		return parameterParser.getParams();
	}

	/**
	 * request URL에 담겨온 파라메터 문자열을 리턴한다. URL에 파라메터가 없다면 ""을 리턴한다.
	 * 
	 * @return 파라메터 문자열
	 */
	public String getQueryString() {
		StringBuffer query = new StringBuffer();
		Enumeration<String> enu = getRequest().getParameterNames();
		String key = null;
		while (enu.hasMoreElements()) {
			key = (String) enu.nextElement();
			query.append(key).append("=")
					.append(getRequest().getParameter(key)).append("&");
		}
		if (query.length() > 0) {
			query.setLength(query.length() - 1);
			return "?" + query.toString();
		} else {
			return "";
		}
	}

	/**
	 * Store a message in this Session
	 */
	public void setMessage(String message) {
		bind(WebKeys.MESSAGE, message);
	}

	/**
	 * Returns the value of the named attribute(MESSAGE) as a String
	 */
	public String getMessage() {
		String message = (String) lookup(WebKeys.MESSAGE);
		if (message == null) {
			message = "";
		} else {
			unbind(WebKeys.MESSAGE);
		}
		return message;
	}

	/**
	 * Store a message in this Session
	 */
	public void setMessageCode(String code) {

		bind(WebKeys.MESSAGE_CODE, code);
	}

	/**
	 * Returns the value of the named attribute(MESSAGE) as a String
	 */
	public String getMessageCode() {
		String code = (String) lookup(WebKeys.MESSAGE_CODE);
		if (code == null) {
			code = "";
		} else {
			unbind(WebKeys.MESSAGE_CODE);
		}
		return code;
	}

	/**
	 * Biz단에서 처리한 HandlerStorage를 리턴한다.
	 * 
	 * @return
	 */
	public HandlerStorage getHandlerStorage() {
		String storageKey = (String) this.request.getAttribute(HandlerStorage.KEY);
		HandlerStorage storage = (HandlerStorage) getAttribute(storageKey);
		return storage;
		// return (HandlerStorage)getAttribute(HandlerStorage.KEY);
	}

	/**
	 * Screen Name을 리턴한다.
	 * 
	 * @return
	 */
	public String getScreenName() {
		String screenName = this.getRequestURI();
		if (screenName.lastIndexOf("/") > 0) {
			screenName = screenName.substring(screenName.lastIndexOf("/") + 1, screenName.length());
		}
		return screenName;
	}

	/**
	 * @return
	 */
	public String getEvent() {
		return getParams().get("fevent");
	}

	/**
	 * @return
	 */
	public String getResultType() {
		return getParams().get("result_type", "SUCCESS");
	}

	/**
	 * Server에 도메인을 리턴한다. ex> http://www.sample.co.kr:80/ ex>
	 * http://www.sample.co.kr:80/contextName/
	 * 
	 * @return
	 */
	public String getServerDomain() {
		String str = "";
		str += super.getRequest().getScheme() + "://"
				+ super.getRequest().getServerName() + ":"
				+ super.getRequest().getServerPort();
		if (!super.getRequest().getContextPath().equals("")) {
			str += "/" + super.getRequest().getContextPath();
		}
		return str;
	}

	/**
	 * 시스템에서 사용하는 로케일을 리턴
	 * 
	 * @return
	 */
	public Locale getLocale() {
		return (Locale) (super.getRequest().getSession().getAttribute(WebKeys.LOCALE));
	}

	/**
	 * 요청한 URI를 리턴
	 * 
	 * @return
	 */
	public String getRequestURI() {
		return (String) this.request.getSession().getAttribute(WebKeys.CURRENT_URI);
	}
}
