package com.devjob.logging;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.UUID;
import org.slf4j.MDC;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * EP37: 요청마다 8자리 requestId를 발급해 MDC에 저장한다.
 * - logback-spring.xml의 패턴에 [%X{requestId}]가 포함되어 있어
 *   같은 요청 안의 모든 로그 라인에 동일한 requestId가 자동으로 찍힌다.
 * - afterCompletion에서 반드시 MDC.clear()를 호출해야 한다.
 *   (스레드 풀이 스레드를 재사용하므로, clear하지 않으면 다음 요청의 로그에
 *    이전 요청의 requestId가 그대로 남는 버그가 발생한다)
 */
public class MdcInterceptor implements HandlerInterceptor {

    private static final String REQUEST_ID = "requestId";
    private static final String CLIENT_IP = "clientIp";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        MDC.put(REQUEST_ID, UUID.randomUUID().toString().substring(0, 8));
        MDC.put(CLIENT_IP, request.getRemoteAddr());
        response.setHeader("X-Request-Id", MDC.get(REQUEST_ID));
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                 Object handler, Exception ex) {
        MDC.clear(); // 스레드 반납 전 반드시 초기화
    }
}
