package incheon.com.cmm.api;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;

import incheon.com.cmm.ResponseCode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

/**
 * @Class Name : DefaultApiResponse.java
 * @Description : API 응답에 대한 일관된 형식을 제공하는 클래스
 * @Modification Information
 *
 *    수정일       수정자         수정내용
 *    -------     -------     -------------------
 *
 */
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(description = "API 응답 포맷")
public class DefaultApiResponse<T> {

    @Schema(description = "응답 코드", example = "200")
    private Integer code;
    
    @Schema(description = "응답 메시지", example = "성공했습니다.")
    private String message;
    
    @Schema(description = "응답 데이터")
    private T data;
    
    @Schema(description = "오류 내용")
    private String error;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
    @Schema(description = "응답 시간", example = "2023-12-25T12:34:56.789")
    private LocalDateTime timestamp;
    
    @Schema(description = "추가 정보")
    private Map<String, Object> meta;

    /**
     * 성공 응답 생성 (데이터 포함)
     * @param data 응답 데이터
     * @return ApiResponse 인스턴스
     */
    public static <T> DefaultApiResponse<T> success(T data) {
        return DefaultApiResponse.<T>builder()
                .code(ResponseCode.SUCCESS.getCode())
                .message(ResponseCode.SUCCESS.getMessage())
                .data(data)
                .timestamp(LocalDateTime.now())
                .build();
    }
    
    /**
     * 성공 응답 생성 (메시지만)
     * @param message 응답 메시지
     * @return ApiResponse 인스턴스
     */
    public static <T> DefaultApiResponse<T> success(String message) {
        return DefaultApiResponse.<T>builder()
                .code(ResponseCode.SUCCESS.getCode())
                .message(message)
                .timestamp(LocalDateTime.now())
                .build();
    }
    
    /**
     * 성공 응답 생성 (데이터와 메시지)
     * @param data 응답 데이터
     * @param message 응답 메시지
     * @return ApiResponse 인스턴스
     */
    public static <T> DefaultApiResponse<T> success(T data, String message) {
        return DefaultApiResponse.<T>builder()
                .code(ResponseCode.SUCCESS.getCode())
                .message(message)
                .data(data)
                .timestamp(LocalDateTime.now())
                .build();
    }
    
    /**
     * 오류 응답 생성
     * @param code 응답 코드
     * @param message 오류 메시지
     * @param error 오류 유형
     * @return ApiResponse 인스턴스
     */
    public static <T> DefaultApiResponse<T> error(int code, String message, String error) {
        return DefaultApiResponse.<T>builder()
                .code(code)
                .message(message)
                .error(error)
                .timestamp(LocalDateTime.now())
                .build();
    }
    
    /**
     * 메타데이터 추가
     * @param key 메타데이터 키
     * @param value 메타데이터 값
     * @return 현재 ApiResponse 인스턴스
     */
    public DefaultApiResponse<T> addMeta(String key, Object value) {
        if (this.meta == null) {
            this.meta = new HashMap<>();
        }
        this.meta.put(key, value);
        return this;
    }
} 