package com.kt.event.common.util;

import com.kt.event.common.exception.BusinessException;
import com.kt.event.common.exception.ErrorCode;

/**
 * 유효성 검증 유틸리티
 * 비즈니스 로직에서 사용하는 공통 유효성 검증 기능 제공
 */
public class ValidationUtil {

    /**
     * null 체크 및 예외 발생
     *
     * @param object    검증할 객체
     * @param errorCode 에러 코드
     * @throws BusinessException 객체가 null인 경우
     */
    public static void requireNonNull(Object object, ErrorCode errorCode) {
        if (object == null) {
            throw new BusinessException(errorCode);
        }
    }

    /**
     * null 체크 및 예외 발생 (커스텀 메시지)
     *
     * @param object    검증할 객체
     * @param errorCode 에러 코드
     * @param message   커스텀 메시지
     * @throws BusinessException 객체가 null인 경우
     */
    public static void requireNonNull(Object object, ErrorCode errorCode, String message) {
        if (object == null) {
            throw new BusinessException(errorCode, message);
        }
    }

    /**
     * 문자열 공백 체크 및 예외 발생
     *
     * @param str       검증할 문자열
     * @param errorCode 에러 코드
     * @throws BusinessException 문자열이 null이거나 공백인 경우
     */
    public static void requireNotBlank(String str, ErrorCode errorCode) {
        if (StringUtil.isBlank(str)) {
            throw new BusinessException(errorCode);
        }
    }

    /**
     * 문자열 공백 체크 및 예외 발생 (커스텀 메시지)
     *
     * @param str       검증할 문자열
     * @param errorCode 에러 코드
     * @param message   커스텀 메시지
     * @throws BusinessException 문자열이 null이거나 공백인 경우
     */
    public static void requireNotBlank(String str, ErrorCode errorCode, String message) {
        if (StringUtil.isBlank(str)) {
            throw new BusinessException(errorCode, message);
        }
    }

    /**
     * 조건 검증 및 예외 발생
     *
     * @param condition 검증할 조건
     * @param errorCode 에러 코드
     * @throws BusinessException 조건이 false인 경우
     */
    public static void require(boolean condition, ErrorCode errorCode) {
        if (!condition) {
            throw new BusinessException(errorCode);
        }
    }

    /**
     * 조건 검증 및 예외 발생 (커스텀 메시지)
     *
     * @param condition 검증할 조건
     * @param errorCode 에러 코드
     * @param message   커스텀 메시지
     * @throws BusinessException 조건이 false인 경우
     */
    public static void require(boolean condition, ErrorCode errorCode, String message) {
        if (!condition) {
            throw new BusinessException(errorCode, message);
        }
    }

    /**
     * 전화번호 유효성 검증
     *
     * @param phoneNumber 전화번호
     * @param errorCode   에러 코드
     * @throws BusinessException 유효하지 않은 전화번호인 경우
     */
    public static void requireValidPhoneNumber(String phoneNumber, ErrorCode errorCode) {
        if (!StringUtil.isValidPhoneNumber(phoneNumber)) {
            throw new BusinessException(errorCode, "유효하지 않은 전화번호입니다: " + phoneNumber);
        }
    }

    /**
     * 이메일 유효성 검증
     *
     * @param email     이메일
     * @param errorCode 에러 코드
     * @throws BusinessException 유효하지 않은 이메일인 경우
     */
    public static void requireValidEmail(String email, ErrorCode errorCode) {
        if (!StringUtil.isValidEmail(email)) {
            throw new BusinessException(errorCode, "유효하지 않은 이메일입니다: " + email);
        }
    }

    /**
     * 사업자번호 유효성 검증
     *
     * @param businessNumber 사업자번호
     * @param errorCode      에러 코드
     * @throws BusinessException 유효하지 않은 사업자번호인 경우
     */
    public static void requireValidBusinessNumber(String businessNumber, ErrorCode errorCode) {
        if (!StringUtil.isValidBusinessNumber(businessNumber)) {
            throw new BusinessException(errorCode, "유효하지 않은 사업자번호입니다: " + businessNumber);
        }
    }

    /**
     * 양수 검증
     *
     * @param value     검증할 값
     * @param errorCode 에러 코드
     * @throws BusinessException 값이 0보다 작거나 같은 경우
     */
    public static void requirePositive(long value, ErrorCode errorCode) {
        if (value <= 0) {
            throw new BusinessException(errorCode, "값은 양수여야 합니다: " + value);
        }
    }

    /**
     * 음수 아닌 값 검증
     *
     * @param value     검증할 값
     * @param errorCode 에러 코드
     * @throws BusinessException 값이 0보다 작은 경우
     */
    public static void requireNonNegative(long value, ErrorCode errorCode) {
        if (value < 0) {
            throw new BusinessException(errorCode, "값은 음수가 아니어야 합니다: " + value);
        }
    }

    /**
     * 범위 검증
     *
     * @param value     검증할 값
     * @param min       최소값
     * @param max       최대값
     * @param errorCode 에러 코드
     * @throws BusinessException 값이 범위를 벗어난 경우
     */
    public static void requireInRange(long value, long min, long max, ErrorCode errorCode) {
        if (value < min || value > max) {
            throw new BusinessException(errorCode,
                    String.format("값은 %d ~ %d 범위여야 합니다: %d", min, max, value));
        }
    }
}
