package com.spring.common.support;

import java.time.LocalDateTime;

import lombok.Builder;
import lombok.Getter;

/**
 * API 응답을 나타내는 제네릭 클래스입니다.
 * 
 * <p>이 클래스는 API 요청에 대한 응답을 구성하는 데 사용되며,
 * 응답의 상태 코드, 경로, 데이터, 메시지 등을 포함합니다.</p>
 * 
 * <p>제네릭 타입 T를 사용하여 다양한 데이터 형식을 지원합니다.</p>
 * 
 * @param <T> 응답 데이터의 타입
 * @author mindol
 * @version 1.0
 */
@Getter
public class ApiResponse<T> {
    
    /**
     * 응답 생성 시각입니다.
     * 
     * <p>응답이 생성된 시각을 나타내며, LocalDateTime 객체로 저장됩니다.</p>
     */
    private final LocalDateTime timestamp = LocalDateTime.now();

    /**
     * HTTP 상태 코드입니다.
     * 
     * <p>응답의 상태를 나타내는 정수 값입니다.</p>
     */
    private int statusCode;

    /**
     * 요청 경로입니다.
     * 
     * <p>응답이 생성된 API의 경로를 나타냅니다.</p>
     */
    private String path;

    /**
     * 응답 데이터입니다.
     * 
     * <p>제네릭 타입 T로 정의된 응답의 실제 데이터를 포함합니다.</p>
     */
    private T data;

    /**
     * 응답 메시지입니다.
     * 
     * <p>응답에 대한 설명이나 상태 메시지를 포함합니다.</p>
     */
    private String message;

    /**
     * ApiResponse 객체를 생성하는 생성자입니다.
     * 
     * <p>상태 코드, 경로, 데이터, 메시지를 사용하여 ApiResponse 객체를 초기화합니다.</p>
     * 
     * @param statusCode 응답의 HTTP 상태 코드
     * @param path 요청 경로
     * @param data 응답 데이터
     * @param message 응답 메시지
     */
    @Builder
    private ApiResponse(int statusCode, String path, T data, String message) {
        this.statusCode = statusCode;
        this.path = path;
        this.data = data;
        this.message = message;
    }

}
