// <copyright file="JsonExtensions.cs" company="Scratch Foundation">
// Copyright (c) Scratch Foundation. All rights reserved.
// </copyright>

namespace ScratchLink.Extensions;

using System.Text.Json;

/// <summary>
/// Extensions for use with <see cref="System.Text.Json"/>.
/// </summary>
public static class JsonExtensions
{
    /// <summary>
    /// Check if the argument is truthy in a JavaScript sense.
    /// </summary>
    /// <param name="element">The JSON element to check.</param>
    /// <returns>True if JavaScript considers the element truthy, false otherwise.</returns>
    public static bool IsTruthy(this JsonElement element) =>
        element.ValueKind switch
        {
            JsonValueKind.Object or JsonValueKind.True => true,
            JsonValueKind.Array => element.GetArrayLength() > 0,
            JsonValueKind.String => element.GetString().Length > 0,
            JsonValueKind.Number => element.GetDouble() != 0,
            _ => false,
        };

    /// <summary>
    /// Return a <see cref="JsonElement"/> if the property is found, or <c>null</c> otherwise.
    /// </summary>
    /// <param name="element">The JSON element to check for the named property.</param>
    /// <param name="propertyName">The name of the property to look for.</param>
    /// <returns>A <see cref="JsonElement"/> representing the property's value, if present.</returns>
    public static JsonElement? TryGetProperty(this JsonElement element, string propertyName)
    {
        if (element.TryGetProperty(propertyName, out var propertyValue))
        {
            return propertyValue;
        }

        return null;
    }
}