package com.unicorn.hgzero.common.exception;

import lombok.Getter;

/**
 * 인프라스트럭처 예외
 * 외부 시스템(데이터베이스, 캐시, 메시지 큐, 스토리지 등) 연동 중 발생하는 예외
 */
@Getter
public class InfraException extends RuntimeException {

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

    /**
     * 에러 상세 정보
     */
    private final Object 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, Object 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 = null;
    }
}
