package com.spring.infra.security.filter;

import java.io.IOException;

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

import org.springframework.lang.NonNull;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter;

import com.spring.infra.security.config.PermittedURI;
import com.spring.infra.security.config.SecurityURI;

/**
 * 사용자가 인증된 경우 특정 URI로 리다이렉트하는 필터 클래스입니다.
 * 
 * <p>이 필터는 사용자가 인증된 상태에서 루트 URI에 접근할 경우,
 * 지정된 리다이렉트 URI로 이동하도록 처리합니다.</p>
 * 
 * <p>인증된 사용자가 루트 URI에 접근하면, 사용자는 대시보드와 같은
 * 다른 페이지로 리다이렉트됩니다.</p>
 * 
 * @author mindol
 * @version 1.0
 */
public class RedirectIfAuthenticatedFilter extends OncePerRequestFilter {

    /**
     * 필터의 내부 로직을 구현하는 메서드입니다.
     * 
     * <p>HTTP 요청을 검사하여 사용자가 인증된 경우 리다이렉트를 수행합니다.</p>
     * 
     * @param request HTTP 요청 객체
     * @param response HTTP 응답 객체
     * @param filterChain 필터 체인
     * @throws ServletException 서블릿 예외
     * @throws IOException 입출력 예외
     */
    @Override
    protected void doFilterInternal(
        @NonNull HttpServletRequest request, 
        @NonNull HttpServletResponse response, 
        @NonNull FilterChain filterChain
    ) throws ServletException, IOException {

        String requestURI = request.getRequestURI();
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        
        // 사용자가 인증된 상태이고 요청 URI가 루트 URI인 경우 리다이렉트 수행
        if (auth != null && auth.isAuthenticated() && PermittedURI.ROOT_URI.getUri().equals(requestURI)) {
            response.sendRedirect(SecurityURI.REDIRECT_URI.getUri());
            return;
        }
        
        // 필터 체인을 계속 진행
        filterChain.doFilter(request, response);

    }
    
}
