package com.kt.event.common.dto;

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

import java.time.LocalDateTime;
import java.util.List;

/**
 * 에러 응답
 * API 에러 발생 시 반환되는 상세 에러 정보
 */
@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ErrorResponse {

    /**
     * 성공 여부 (항상 false)
     */
    @Builder.Default
    private final boolean success = false;

    /**
     * 에러 코드
     */
    private final String errorCode;

    /**
     * 에러 메시지
     */
    private final String message;

    /**
     * 상세 에러 정보 (선택)
     */
    private final String details;

    /**
     * 유효성 검증 에러 목록 (선택)
     */
    private final List<FieldError> fieldErrors;

    /**
     * 에러 발생 시간
     */
    @Builder.Default
    private final LocalDateTime timestamp = LocalDateTime.now();

    /**
     * 필드 유효성 검증 에러
     */
    @Getter
    @Builder
    @AllArgsConstructor
    public static class FieldError {
        /**
         * 필드명
         */
        private final String field;

        /**
         * 입력된 값
         */
        private final Object rejectedValue;

        /**
         * 에러 메시지
         */
        private final String message;
    }

    /**
     * 기본 에러 응답 생성
     *
     * @param errorCode 에러 코드
     * @param message   에러 메시지
     * @return ErrorResponse
     */
    public static ErrorResponse of(String errorCode, String message) {
        return ErrorResponse.builder()
                .errorCode(errorCode)
                .message(message)
                .build();
    }

    /**
     * 상세 정보가 포함된 에러 응답 생성
     *
     * @param errorCode 에러 코드
     * @param message   에러 메시지
     * @param details   상세 에러 정보
     * @return ErrorResponse
     */
    public static ErrorResponse of(String errorCode, String message, String details) {
        return ErrorResponse.builder()
                .errorCode(errorCode)
                .message(message)
                .details(details)
                .build();
    }

    /**
     * 필드 유효성 검증 에러 응답 생성
     *
     * @param errorCode   에러 코드
     * @param message     에러 메시지
     * @param fieldErrors 필드 에러 목록
     * @return ErrorResponse
     */
    public static ErrorResponse of(String errorCode, String message, List<FieldError> fieldErrors) {
        return ErrorResponse.builder()
                .errorCode(errorCode)
                .message(message)
                .fieldErrors(fieldErrors)
                .build();
    }
}
