package nlib.cmm.session;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import egovframework.com.ext.oauth.service.OAuthUniversalUser;
import nlib.util.StringUtil;

/**
 * <pre>
 * @Class Name : SessionConfig.java
 * 
 * @Description : 멀티도메인에서의 로그인 처리를 위해 지방문화원에서 해당 세션에서 로그인처리 가능한 정보를 관리하는 클래스 
 * 
 * 
 * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
 *
 * </pre>
 *
 * @ ------------    --------    ---------------------------
 * @ 수정일                     수정자             수정내용
 * @ ------------    --------    ---------------------------
 * @ 2021. 8. 25.    KNKIM       최초 생성
 *
 * 
 * @author 이씨플라자 * DIGITALSHIP KNKIM
 * @since 2021. 8. 25.
 * @version 1.0
 *
 */
@WebListener
public class SessionConfig implements HttpSessionListener {

	private static final Logger log = LoggerFactory.getLogger(SessionConfig.class);

	/* 사용자 정보를 구분하는 구분자 */
	private static final String DELIMITER = "\t";

	/* 세션별 로그인 처리 가능한 정보 목록  */
	private static final Map<String, Object> loginSessions = new ConcurrentHashMap<>();
	
	/* 세션별 회원가입 처리 가능한 정보 목록  */
	private static final Map<String, Object> memberSessions = new ConcurrentHashMap<>();

	@Override
	public void sessionCreated(HttpSessionEvent se) {
		log.debug("Session sessionCreated (O) : " + se.getSession().getId());
	}
	
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		String sessionId = se.getSession().getId();
		log.debug("Session sessionDestroyed (X) : " + sessionId);
		if(loginSessions.get(sessionId) != null){
			removeLoginInfo(sessionId);
		}
		if(memberSessions.get(sessionId) != null){
			removeNewMemberInfo(sessionId);
		}
	}
	
	/**
	 * 지방문화원 해당 세션에 로그인 처리 가능한 SNS유형 및 SNSID 정보를 저장한다.  
	 * 
	 * @param sessionId
	 * @param snsType
	 * @param snsId
	 */
	public static void setLoginInfo(String sessionId, OAuthUniversalUser oUser) {
		log.debug("setLoginInfo : " + sessionId + ", " + oUser.getSnsType() + ", " + oUser.getSnsId());
		loginSessions.put(sessionId, oUser);
	}
	
	/**
	 * 지방문화원 해당 세션에 로그인 처리 가능한 SNS 유형 및 SNS ID 정보를 리턴한다.
	 * 리턴유형 문자열 배열
	 * 	[0] : snsType
	 * 	[1] : snsId 
	 * 
	 * @param sessionId
	 * @return
	 */
	public static OAuthUniversalUser getLoginInfo(String sessionId) {
		
		if(StringUtil.isEmpty(sessionId)) return null;
		
		return (OAuthUniversalUser)loginSessions.get(sessionId);
	}
	
	/**
	 * 지방문화원 해당 세션에 로그인 처리 가능한 SNS 유형 및 SNS ID 정보를 리턴하고 목록에서 삭제한다.
	 * 리턴유형 문자열 배열
	 * 	[0] : snsType
	 * 	[1] : snsId 
	 * 
	 * @param sessionId
	 * @return
	 */
	public static OAuthUniversalUser popLoginInfo(String sessionId) {
		
		OAuthUniversalUser ret = getLoginInfo(sessionId);
		removeLoginInfo(sessionId);
		
		return ret;
	}
	
	/**
	 * 지방문화원 해당 세션에 로그인 처리 가능한 정보를 삭제한다.
	 * (로그인 처리 완료 후 또는 세션 종료 시, 삭제)  
	 * 
	 * @param sessionId
	 * @param snsType
	 * @param snsId
	 */
	public static void removeLoginInfo(String sessionId) {
		if(StringUtil.isNotEmpty(sessionId)){
			loginSessions.remove(sessionId);	
			log.debug("removeLoginInfo > sessionId = " + sessionId);
		}
	}
	
	/**
	 * 지방문화원 해당 세션에 회원가입 처리 가능한 SNS유형 및 SNS 프로파일 정보를 저장한다.  
	 * 
	 * @param sessionId
	 * @param snsType
	 * @param snsId
	 */
	public static void setNewMemberInfo(String sessionId, OAuthUniversalUser oUser) {
		log.debug("setLoginInfo : " + sessionId + ", " + oUser.getSnsId());
		memberSessions.put(sessionId, oUser);
	}

	/**
	 * 지방문화원 해당 세션에 회원가입 처리 가능한 SNS 유형 및 SNS 프로파일 정보를 리턴한다.
	 * 
	 * @param sessionId
	 * @return
	 */
	public static OAuthUniversalUser getNewMemberInfo(String sessionId) {
		if(StringUtil.isEmpty(sessionId)) return null;
		
		return (OAuthUniversalUser)memberSessions.get(sessionId);
	}

	/**
	 * 지방문화원 해당 세션에 회원가입 처리 가능한 SNS 유형 및 SNS 프로파일 정보를 리턴한다.
	 * 
	 * @param sessionId
	 * @return
	 */
	public static OAuthUniversalUser popNewMemberInfo(String sessionId) {
		OAuthUniversalUser ret = getNewMemberInfo(sessionId);
		removeNewMemberInfo(sessionId);
		
		return ret;
	}
	
	/**
	 * 지방문화원 해당 세션에 회원가입 처리 가능한 정보를 삭제한다.
	 * (회원가입 처리 완료 후 또는 세션 종료 시, 삭제)  
	 * 
	 * @param sessionId
	 * @param snsType
	 * @param snsId
	 */
	public static void removeNewMemberInfo(String sessionId) {
		if(StringUtil.isNotEmpty(sessionId)){
			memberSessions.remove(sessionId);	
			log.debug("removeNewMemberInfo > sessionId = " + sessionId);
		}
	}
}