package com.kt.event.common.exception;

import lombok.Getter;

/**
 * 인프라 예외
 * 인프라 계층에서 발생하는 예외
 * (예: DB 연결 실패, Redis 오류, Kafka 오류, 외부 API 호출 실패 등)
 */
@Getter
public class InfraException extends RuntimeException {

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

    /**
     * 상세 에러 정보
     */
    private final String details;

    /**
     * 인프라 예외 생성 (기본 메시지 사용)
     *
     * @param errorCode 에러 코드
     */
    public InfraException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
        this.details = null;
    }

    /**
     * 인프라 예외 생성 (커스텀 메시지 사용)
     *
     * @param errorCode 에러 코드
     * @param message   커스텀 에러 메시지
     */
    public InfraException(ErrorCode errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
        this.details = null;
    }

    /**
     * 인프라 예외 생성 (상세 정보 포함)
     *
     * @param errorCode 에러 코드
     * @param message   커스텀 에러 메시지
     * @param details   상세 에러 정보
     */
    public InfraException(ErrorCode errorCode, String message, String details) {
        super(message);
        this.errorCode = errorCode;
        this.details = details;
    }

    /**
     * 인프라 예외 생성 (원인 예외 포함)
     *
     * @param errorCode 에러 코드
     * @param cause     원인 예외
     */
    public InfraException(ErrorCode errorCode, Throwable cause) {
        super(errorCode.getMessage(), cause);
        this.errorCode = errorCode;
        this.details = cause.getMessage();
    }

    /**
     * 인프라 예외 생성 (모든 정보 포함)
     *
     * @param errorCode 에러 코드
     * @param message   커스텀 에러 메시지
     * @param details   상세 에러 정보
     * @param cause     원인 예외
     */
    public InfraException(ErrorCode errorCode, String message, String details, Throwable cause) {
        super(message, cause);
        this.errorCode = errorCode;
        this.details = details;
    }
}
