using System.Text.Json.Nodes;
using Shouldly;
using Xunit;
using ZB.MOM.WW.OtOpcUa.AdminUI.Components.Shared.Drivers.DeviceForms;

namespace ZB.MOM.WW.OtOpcUa.AdminUI.Tests.Uns;

/// <summary>
///     Guards for the MQTT <b>device</b> model. MQTT holds ONE broker connection per driver, so — like
///     Galaxy — the device carries no endpoint of its own and the model round-trips its DeviceConfig
///     verbatim. The one behaviour it does add is detecting <i>legacy</i> connection keys left on a
///     DeviceConfig by a pre-form (hand-authored / SQL-seeded) deployment, because
///     <c>DriverDeviceConfigMerger</c> merges a sole device's keys UP over the driver's and they would
///     otherwise silently win over what the driver form shows.
/// </summary>
public sealed class MqttDeviceModelTests
{
    [Fact]
    public void Round_trips_every_key_verbatim()
    {
        const string inbound = """{"Host":"10.100.0.35","Port":8883,"anything":{"nested":true}}""";

        var json = MqttDeviceModel.FromJson(inbound).ToJson();
        var o = (JsonObject)JsonNode.Parse(json)!;

        o["Host"]!.GetValue<string>().ShouldBe("10.100.0.35");
        o["Port"]!.GetValue<int>().ShouldBe(8883);
        o["anything"]!["nested"]!.GetValue<bool>().ShouldBeTrue();
    }

    [Fact]
    public void A_new_device_serializes_to_an_empty_object()
        => MqttDeviceModel.FromJson(null).ToJson().ShouldBe("{}");

    [Fact]
    public void A_malformed_blob_degrades_to_an_empty_object_rather_than_throwing()
        => MqttDeviceModel.FromJson("}{ not json").ToJson().ShouldBe("{}");

    [Fact]
    public void Validate_always_passes_because_there_is_no_per_device_endpoint()
        => MqttDeviceModel.FromJson("""{"Host":"x"}""").Validate().ShouldBeNull();

    [Fact]
    public void Legacy_connection_keys_are_reported_case_insensitively()
    {
        var model = MqttDeviceModel.FromJson("""{"host":"h","PORT":1883,"useTls":false,"unrelated":1}""");

        model.LegacyConnectionKeys.ShouldBe(["host", "PORT", "useTls"], ignoreOrder: true);
    }

    [Fact]
    public void An_empty_device_reports_no_legacy_connection_keys()
        => MqttDeviceModel.FromJson("{}").LegacyConnectionKeys.ShouldBeEmpty();
}
