package com.kt.event.common.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.time.LocalDateTime;

/**
 * 공통 API 응답 래퍼
 * 모든 API 응답을 감싸는 표준 응답 포맷
 *
 * @param <T> 응답 데이터 타입
 */
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponse<T> {

    /**
     * 성공 여부
     */
    private final boolean success;

    /**
     * 응답 데이터
     */
    private final T data;

    /**
     * 에러 코드 (실패 시)
     */
    private final String errorCode;

    /**
     * 에러 메시지 (실패 시)
     */
    private final String message;

    /**
     * 응답 시간
     */
    private final LocalDateTime timestamp;

    /**
     * 성공 응답 생성 (데이터 포함)
     *
     * @param data 응답 데이터
     * @param <T>  응답 데이터 타입
     * @return API 응답
     */
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(true, data, null, null, LocalDateTime.now());
    }

    /**
     * 성공 응답 생성 (데이터 없음)
     *
     * @param <T> 응답 데이터 타입
     * @return API 응답
     */
    public static <T> ApiResponse<T> success() {
        return new ApiResponse<>(true, null, null, null, LocalDateTime.now());
    }

    /**
     * 실패 응답 생성
     *
     * @param errorCode 에러 코드
     * @param message   에러 메시지
     * @param <T>       응답 데이터 타입
     * @return API 응답
     */
    public static <T> ApiResponse<T> error(String errorCode, String message) {
        return new ApiResponse<>(false, null, errorCode, message, LocalDateTime.now());
    }
}
