package com.spring.infra.security.handler;

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

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutHandler;

import com.spring.infra.security.jwt.JwtTokenRule;
import com.spring.infra.security.jwt.JwtTokenService;

import lombok.RequiredArgsConstructor;

/**
 * 사용자 로그아웃 처리를 담당하는 핸들러 클래스입니다.
 * 
 * <p>이 클래스는 Spring Security의 LogoutHandler 인터페이스를 구현하여,
 * 사용자가 로그아웃할 때 필요한 작업을 수행합니다.</p>
 * 
 * <p>로그아웃 시 JWT 리프레시 토큰을 삭제하고, 관련 쿠키를 제거합니다.</p>
 * 
 * @author mindol
 * @version 1.0
 */
@RequiredArgsConstructor
public class SignOutHandler implements LogoutHandler {

    /**
     * JWT 토큰 서비스를 제공하는 서비스 객체입니다.
     * 
     * <p>로그아웃 시 리프레시 토큰을 삭제하고 쿠키를 제거하는 데 사용됩니다.</p>
     */
    private final JwtTokenService jwtTokenService;

    /**
     * 사용자가 로그아웃할 때 호출되는 메서드입니다.
     * 
     * <p>HTTP 요청에서 리프레시 토큰을 추출하고, 해당 토큰을 삭제한 후,
     * 관련 쿠키를 제거합니다.</p>
     * 
     * @param request HTTP 요청 객체
     * @param response HTTP 응답 객체
     * @param authentication 인증 정보
     */
    @Override
    public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        // 요청에서 리프레시 토큰을 추출합니다.
        String refreshToken = jwtTokenService.resolveTokenFromCookie(request, JwtTokenRule.REFRESH_PREFIX);
        
        // 리프레시 토큰을 삭제합니다.
        jwtTokenService.deleteRefreshToken(jwtTokenService.getUserPk(refreshToken));
        
        // 관련 쿠키를 제거합니다.
        jwtTokenService.deleteCookie(response);
    }
    
}
