package kr.lunaticbum.back.lun.configs.web

import jakarta.servlet.FilterChain
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.slf4j.LoggerFactory
import org.springframework.core.Ordered
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
import org.springframework.web.filter.OncePerRequestFilter

@Component
@Order(Ordered.HIGHEST_PRECEDENCE) // 👈 1. 모든 필터 중 가장 먼저 실행되도록 설정
class RequestLoggingFilter : OncePerRequestFilter() {

    // 2. Slf4j 로거 생성 (SecurityConfig의 LogService 대신 표준 로거 사용)
    private val log = LoggerFactory.getLogger(RequestLoggingFilter::class.java)

    override fun doFilterInternal(
        request: HttpServletRequest,
        response: HttpServletResponse,
        filterChain: FilterChain
    ) {
        val requestUri = request.requestURI

        // 3. (선택적) 'puzzle' 관련 요청만 로깅하여 로그 양 조절
        val shouldLog = requestUri.contains("puzzle") || requestUri.contains("api")

        if (shouldLog) {
            val method = request.method
            val queryString = if (request.queryString != null) "?${request.queryString}" else ""
            log.info(">>> REQUEST: [$method] $requestUri$queryString")
        }

        try {
            // 4. 실제 요청 처리 (다음 필터 또는 컨트롤러로 전달)
            filterChain.doFilter(request, response)
        } finally {
            // 5. 응답이 나갈 때 상태 코드 로깅
            val status = response.status

            // ⚠️ 301 리디렉션이 발생하면 경고(WARN) 레벨로 상세히 로깅
            if (status == HttpServletResponse.SC_MOVED_PERMANENTLY) { // 301
                val location = response.getHeader("Location") // 리디렉션 대상 URL
                log.warn("<<< RESPONSE 301 (Moved Permanently):")
                log.warn("<<< FROM: [${request.method}] ${request.requestURI}")
                log.warn("<<< TO:   $location") // 👈 이 주소를 확인하세요!
            }
            // (선택적) 그 외 'puzzle' 요청의 응답 로깅
            else if (shouldLog) {
                log.info("<<< RESPONSE: $status FOR [${request.method}] $requestUri")
            }
        }
    }
}