package com.style24.front.support.security.handler;

import java.io.IOException;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;

import com.style24.front.biz.service.TsfLoginService;
import com.style24.front.support.exception.TsfDormantAccountException;
import com.style24.front.support.exception.TsfEmailDuplicationException;
import com.style24.front.support.exception.TsfLockedAccountException;
import com.style24.front.support.exception.TsfSecedeAccountException;
import com.style24.front.support.exception.TsfSessionExpiredException;

import lombok.extern.slf4j.Slf4j;

import com.gagaframework.web.parameter.GagaMap;
import com.gagaframework.web.util.GagaStringUtil;

/**
 * 로그인 실패 시 호출되는 Handler
 * 		1. 비밀번호 5회 이상 실패 시
 * 		2. 휴면회원 로그인 시
 * 		3. 탈퇴회원 로그인 시
 * 
 * @author gagamel
 * @since 2020. 9. 11
 */
@Slf4j
public class TsfLoginFailureHandler implements AuthenticationFailureHandler {

	@Autowired
	private TsfLoginService loginService;

	@Override
	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
		AuthenticationException exception) throws IOException, ServletException {

		// 로그인 실패 남기기
		loginService.createLoginFail(request.getParameter("custId"), "Y");

		GagaMap result = new GagaMap();
		result.setString("message", exception.getMessage());

		if (exception instanceof TsfLockedAccountException) { // 로그인 시에 비밀번호 5회 이상 틀려서 계정이 잠기는 경우
			result.setString("status", "PWD_5WRONG");
		} else if (exception instanceof TsfDormantAccountException) { // 휴면회원 로그인 시
			result.setString("status", "DORMANT_CUST");
		} else if (exception instanceof TsfSecedeAccountException) { // 탈퇴회원 로그인 시
			result.setString("status", "SECEDE_CUST");
		} else if (exception instanceof TsfSessionExpiredException) { // 세션 만료 시
			result.setString("status", "SESSION_EXPIRED");
		} else if (exception instanceof TsfEmailDuplicationException) { // SNS용 이메일 중복 시
			result.setString("status", "EMAIL_DUP");
		} else {
			result.setString("status", "ETC_ERROR");
		}

		GagaStringUtil.write(response, result);
	}

}
