package com.kt.event.common.exception;

import lombok.Getter;

/**
 * 비즈니스 예외
 * 비즈니스 로직 처리 중 발생하는 예외
 * (예: 중복 데이터, 권한 없음, 유효하지 않은 상태 전환 등)
 */
@Getter
public class BusinessException extends RuntimeException {

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

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

    /**
     * 비즈니스 예외 생성 (기본 메시지 사용)
     *
     * @param errorCode 에러 코드
     */
    public BusinessException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
        this.details = null;
    }

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

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

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

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