package com.rg.login.controller;

import java.io.IOException;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import com.rg.login.service.LoginService;
import com.rg.util.CookieHandle;
import com.rg.util.RedisService3;
import com.rg.login.dto.UserDetailsVO;

@Component
public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler {

	private final Logger logger = LogManager.getLogger(CustomLoginSuccessHandler.class);

	private final LoginService loginService;

	private final RedisService3 redisService;
	
	public CustomLoginSuccessHandler(LoginService loginService, RedisService3 redisService) {
		this.loginService = loginService;
		this.redisService = redisService;
	}
	
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException, ServletException {

		String userId = (String)authentication.getPrincipal();

		String loginId = authentication.getName();
		String loginName = loginService.getUserName(loginId);

		HttpSession session = request.getSession();

		String sId = session.getId();
		

		session.setAttribute("loginId", loginId);
		session.setAttribute("loginUserName", loginName);
		
		UserDetailsVO userDetailsVO = new UserDetailsVO();
		int sessionTime = 60 * 60 * 5;
		
		userDetailsVO.setLoginId(loginId);
		userDetailsVO.setLoginUserId1(userId);
		userDetailsVO.setLoginUserName(loginName);
		
		redisService.deleteRedisLikeSession("LOGIN||SESSION||" + loginId + "||*");
		
		// save redis session
		String redisKey = "LOGIN||SESSION||" + loginId + "||" + sId;
		redisService.insertRedisMap(redisKey, new HashMap<String, Object>(userDetailsVO.getMap()));
		redisService.setTimeOutSecond(redisKey, sessionTime);
		
		CookieHandle.setCookie(response, "login_id", loginId);
		CookieHandle.setCookie(response, "session_id", sId);

		response.sendRedirect("/rg/index.jsp");
	}
}
