using Volo.Abp;
#nullable enable

namespace LifePayment.Domain.Shared;

/// <summary>
/// 校验扩展
/// </summary>
public static class CheckExtensions
{

    /// <summary>
    /// 如果校验条件为true则抛出友好异常
    /// </summary>
    /// <param name="checkCondition"></param>
    /// <param name="userFriendlyMessage"></param>
    /// <exception cref="UserFriendlyException"></exception>
    public static void IfTrueThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage)
    {
        IfTrueThrowUserFriendlyException(checkCondition, null, userFriendlyMessage, null);
    }

    /// <summary>
    /// 如果校验条件为false则抛出友好异常
    /// </summary>
    /// <param name="checkCondition"></param>
    /// <param name="userFriendlyMessage"></param>
    /// <exception cref="UserFriendlyException"></exception>
    public static void IfFalseThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage)
    {
        IfFalseThrowUserFriendlyException(checkCondition, userFriendlyMessage, null);
    }

    /// <summary>
    /// 如果校验条件为true则抛出友好异常
    /// </summary>
    /// <param name="checkCondition"></param>
    /// <param name="userFriendlyMessage"></param>
    /// <param name="args"></param>
    /// <exception cref="UserFriendlyException"></exception>
    public static void IfTrueThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage, params object?[]? args)
    {
        var exceptionString = args == null ? userFriendlyMessage : string.Format(userFriendlyMessage, args);
        if (checkCondition)
        {
            throw new UserFriendlyException(exceptionString);
        }
    }

    /// <summary>
    /// 如果校验条件为true则抛出友好异常
    /// </summary>
    /// <param name="checkCondition"></param>
    /// <param name="code"></param
    /// <param name="userFriendlyMessage"></param>
    /// <param name="args"></param>
    /// <exception cref="UserFriendlyException"></exception>
    public static void IfTrueThrowUserFriendlyException(bool checkCondition, int? code, string userFriendlyMessage, params object?[]? args)
    {
        var exceptionString = args == null ? userFriendlyMessage : string.Format(userFriendlyMessage, args);
        if (checkCondition)
        {
            throw new UserFriendlyException(exceptionString, code.HasValue ? code.Value.ToString() : null);
        }
    }

    /// <summary>
    /// 如果校验条件为false则抛出友好异常
    /// </summary>
    /// <param name="checkCondition"></param>
    /// <param name="userFriendlyMessage"></param>
    /// <param name="args"></param>
    /// <exception cref="UserFriendlyException"></exception>
    public static void IfFalseThrowUserFriendlyException(bool checkCondition, string userFriendlyMessage, params object?[]? args)
    {
        var exceptionString = args == null ? userFriendlyMessage : string.Format(userFriendlyMessage, args);
        if (!checkCondition)
        {
            throw new UserFriendlyException(exceptionString);
        }
    }
}