package com.takensoft.common.util;


import com.takensoft.common.message.MessageCode;
import lombok.RequiredArgsConstructor;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

import java.nio.charset.Charset;

/**
 * @author  : takensoft
 * @since   : 2025.01.22
 * @modification
 *     since    |    author    | description
 *  2025.01.22  |  takensoft   | 최초 등록
 *  2025.03.21  |    하석형     | 에러 응답 추가 메세지 추가
 *
 * HTTP 응답 처리를 위한 유틸리티
 */
@Component
@RequiredArgsConstructor
public class ResponseUtil {

    private final MessageSource messageSource;

    /**
     * @return JSON 응답을 위한 HttpHeaders 객체
     *
     * HTTp 해더 생성성
     */
    private static HttpHeaders createHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
        return headers;
    }

    /**
     * @param messageCode - 메시지 코드
     * @return 다국어 메시지
     *
     * 다국어 메시지 호출
     */
    private String getMessage(MessageCode messageCode) {
        return messageSource.getMessage(messageCode.getMessageKey(), null, LocaleContextHolder.getLocale());
    }

    /**
     * @param data    - 응답 데이터
     * @param messageCode - 응답 메시지 코드
     * @return 성공 응답 결과
     * 
     * 성공 응답 생성
     */
    public ResponseEntity<?> successRes(Object data, MessageCode messageCode) {
        ResponseData responseData = new ResponseData();
                     responseData.setStatus(messageCode.getStatus().value());
                     responseData.setStatusText(messageCode.getStatus());
                     responseData.setMessage(getMessage(messageCode));
                     responseData.setData(data);
        return new ResponseEntity<>(responseData, createHeaders(), HttpStatus.OK);
    }

    /**
     * @param status  - HTTP 상태 코드
     * @param message - 에러 메시지
     * @return 에러 응답 결과
     * 
     * 에러 응답 생성
     */
    public ResponseEntity<?> errorRes(HttpStatus status, String message) {
        ResponseData responseData = new ResponseData();
                     responseData.setStatus(status.value());
                     responseData.setStatusText(status);
                     responseData.setMessage(message);
        return new ResponseEntity<>(responseData, createHeaders(), status);
    }

    /**
     * @param messageCode - 응답 메시지 코드
     * @return 에러 응답 결과
     *
     * 에러 응답 생성
     */
    public ResponseEntity<?> errorRes(MessageCode messageCode) {
        return errorRes(messageCode, "");
    }

    /**
     * @param messageCode - 응답 메시지 코드
     * @param addMessage  - 추가 메시지
     * @return 에러 응답 결과
     *
     * 에러 응답 생성
     */
    public ResponseEntity<?> errorRes(MessageCode messageCode, String addMessage) {
        ResponseData responseData = new ResponseData();
                     responseData.setStatus(messageCode.getStatus().value());
                     responseData.setStatusText(messageCode.getStatus());
                     responseData.setMessage(getMessage(messageCode) + (addMessage != null ? addMessage : ""));
        return new ResponseEntity<>(responseData, createHeaders(), messageCode.getStatus());
    }
}
