package incheon.com.cmm.api;

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import incheon.com.cmm.service.ResultVO;

/**
 * @Class Name : RestResponseAdvice.java
 * @Description : API 응답을 일관된 형식으로 변환하는 어드바이스
 * @Modification Information
 *
 *    수정일       수정자         수정내용
 *    -------     -------     -------------------
 *
 */
@RestControllerAdvice(basePackages = {"incheon.com", "incheon.tmp"})
public class RestResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // ApiResponse로 이미 포장된 응답이거나 byte[], String 등과 같은 단순 응답은 처리하지 않음
        return !returnType.getParameterType().equals(DefaultApiResponse.class)
                && !returnType.getParameterType().equals(byte[].class)
                && !returnType.getParameterType().equals(String.class);
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                 Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                 ServerHttpRequest request, ServerHttpResponse response) {
        
        // null인 경우 빈 성공 응답 반환
        if (body == null) {
            return DefaultApiResponse.success(null);
        }
        
        // 이미 DefaultApiResponse 타입인 경우 그대로 반환
        if (body instanceof DefaultApiResponse) {
            return body;
        }
        
        // 기존 ResultVO 타입을 ApiResponse로 변환
        if (body instanceof ResultVO) {
            ResultVO resultVO = (ResultVO) body;
            return DefaultApiResponse.builder()
                    .code(resultVO.getResultCode())
                    .message(resultVO.getResultMessage())
                    .data(resultVO.getResult())
                    .timestamp(java.time.LocalDateTime.now())
                    .build();
        }
        
        // 일반 객체는 성공 응답으로 감싸기
        return DefaultApiResponse.success(body);
    }
} 