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

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

import org.apache.commons.lang3.StringUtils;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import lombok.extern.slf4j.Slf4j;

import com.gagaframework.web.parameter.GagaMap;
import com.gagaframework.web.parameter.GagaParameterUtil;

/**
 * 인증 Filter
 * 		SNS(네이버, 카카오, 페이스북 등) 로그인 처리 시 Spring Security를 이용할 경우 기본적인 로그인 처리 방식으로는 파라미터를 받을 수 없다.
 * 		request.getParameter를 통해 Username과 Password를 얻을 수 있도록 만든 인증 Filter
 * 
 * @author gagamel
 * @since 2020. 9. 11
 */
@Slf4j
public class TsfAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

	@Override
	public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
		// Parameter
		GagaMap loginParams = GagaParameterUtil.getParameterMap(request);

		if (StringUtils.isNotBlank(loginParams.getString("snsType"))) { // SNS로그인
			// SNS로그인일 때는
			// 로그인ID: SNS_TYPE-SNS_JOIN_ID
			// 비밀번호: 이메일
			loginParams.setString("loginId", loginParams.getString("snsType") + "-" + loginParams.getString("snsJoinId"));
			loginParams.setString("passwd", loginParams.getString("email")); // SNS로그인 시 불필요해서 이메일체크를 위해 추가
		} else { // 일반로그인
			if (StringUtils.isNotBlank(loginParams.getString("loginId"))) {
				loginParams.setString("loginId", loginParams.getString("loginId").trim());
			}

			if (StringUtils.isNotBlank(loginParams.getString("passwd"))) {
				loginParams.setString("passwd", loginParams.getString("passwd").trim());
			}
		}

		log.debug("loginParams: {}", loginParams);

		UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
			loginParams.getString("loginId"), loginParams.getString("passwd"));

		// Allow subclasses to set the "details" property
		setDetails(request, authRequest);

		return this.getAuthenticationManager().authenticate(authRequest);
	}

}
