package com.spring.infra.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.Qualifier;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;

import lombok.RequiredArgsConstructor;

/**
 * 사용자 로그인 실패를 처리하는 핸들러 클래스입니다.
 * 
 * <p>이 클래스는 Spring Security의 AuthenticationFailureHandler 인터페이스를 구현하여,
 * 사용자 인증 실패 시 적절한 처리를 수행합니다.</p>
 * 
 * <p>로그인 실패 시 발생하는 예외를 처리하고, 이를 기반으로 적절한 응답을 생성합니다.</p>
 * 
 * @author mindol
 * @version 1.0
 */
@Component
@RequiredArgsConstructor
public class SigninFailureHandler implements AuthenticationFailureHandler {

    /**
     * 예외 처리 리졸버.
     * 
     * <p>Spring의 HandlerExceptionResolver를 사용하여 예외를 처리합니다.</p>
     */
    @Qualifier("handlerExceptionResolver")
    private final HandlerExceptionResolver resolver;

    /**
     * 사용자 인증 실패 시 호출되는 메서드입니다.
     * 
     * <p>인증 실패 시 발생하는 예외를 처리하고, 적절한 응답을 생성합니다.</p>
     * 
     * @param request HTTP 요청 객체
     * @param response HTTP 응답 객체
     * @param exception 인증 예외
     * @throws IOException 입출력 예외
     * @throws ServletException 서블릿 예외
     */
    @Override
    public void onAuthenticationFailure(
        HttpServletRequest request, 
        HttpServletResponse response, 
        AuthenticationException exception
    ) throws IOException, ServletException {
        // 인증 실패 시 예외를 처리합니다.
        resolver.resolveException(request, response, null, exception);
    }
    
}
