package com.unicorn.hgzero.common.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * API 응답 공통 포맷
 * 모든 API 응답에 사용되는 표준 응답 형식
 *
 * @param <T> 응답 데이터 타입
 */
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponse<T> {

    /**
     * 응답 상태 (success, error)
     */
    private String status;

    /**
     * 응답 메시지
     */
    private String message;

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

    /**
     * 에러 코드 (에러 발생 시)
     */
    private String code;

    /**
     * 에러 상세 정보 (에러 발생 시)
     */
    private Object details;

    /**
     * 응답 타임스탬프
     */
    @Builder.Default
    private LocalDateTime timestamp = LocalDateTime.now();

    /**
     * 성공 응답 생성
     *
     * @param <T> 응답 데이터 타입
     * @param data 응답 데이터
     * @return 성공 응답
     */
    public static <T> ApiResponse<T> success(T data) {
        return ApiResponse.<T>builder()
                .status("success")
                .data(data)
                .timestamp(LocalDateTime.now())
                .build();
    }

    /**
     * 성공 응답 생성 (메시지 포함)
     *
     * @param <T> 응답 데이터 타입
     * @param message 성공 메시지
     * @param data 응답 데이터
     * @return 성공 응답
     */
    public static <T> ApiResponse<T> success(String message, T data) {
        return ApiResponse.<T>builder()
                .status("success")
                .message(message)
                .data(data)
                .timestamp(LocalDateTime.now())
                .build();
    }

    /**
     * 에러 응답 생성
     *
     * @param code 에러 코드
     * @param message 에러 메시지
     * @return 에러 응답
     */
    public static ApiResponse<Void> error(String code, String message) {
        return ApiResponse.<Void>builder()
                .status("error")
                .code(code)
                .message(message)
                .timestamp(LocalDateTime.now())
                .build();
    }

    /**
     * 에러 응답 생성 (메시지만)
     *
     * @param message 에러 메시지
     * @return 에러 응답
     */
    public static ApiResponse<Void> error(String message) {
        return ApiResponse.<Void>builder()
                .status("error")
                .code("GENERAL_ERROR")
                .message(message)
                .timestamp(LocalDateTime.now())
                .build();
    }

    /**
     * 타입 안전한 에러 응답 생성 (메시지만)
     *
     * @param <T> 응답 데이터 타입
     * @param message 에러 메시지
     * @return 에러 응답
     */
    public static <T> ApiResponse<T> errorWithType(String message) {
        return ApiResponse.<T>builder()
                .status("error")
                .code("GENERAL_ERROR")
                .message(message)
                .timestamp(LocalDateTime.now())
                .build();
    }

    /**
     * 에러 응답 생성 (상세 정보 포함)
     *
     * @param code 에러 코드
     * @param message 에러 메시지
     * @param details 에러 상세 정보
     * @return 에러 응답
     */
    public static ApiResponse<Void> error(String code, String message, Object details) {
        return ApiResponse.<Void>builder()
                .status("error")
                .code(code)
                .message(message)
                .details(details)
                .timestamp(LocalDateTime.now())
                .build();
    }
}
