using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using Questionable.Model.Common;

namespace Questionable.Model.Questing.Converter;

public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut>
{
    private static readonly Dictionary<EAetheryteLocation, string> EnumToString = AethernetShardConverter.Values;
    private static readonly Dictionary<string, EAetheryteLocation> StringToEnum =
        EnumToString.ToDictionary(x => x.Value, x => x.Key);

    public override AethernetShortcut Read(ref Utf8JsonReader reader, Type typeToConvert,
        JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartArray)
            throw new JsonException();

        if (!reader.Read() || reader.TokenType != JsonTokenType.String)
            throw new JsonException();

        string from = reader.GetString() ?? throw new JsonException();

        if (!reader.Read() || reader.TokenType != JsonTokenType.String)
            throw new JsonException();

        string to = reader.GetString() ?? throw new JsonException();

        if (!reader.Read() || reader.TokenType != JsonTokenType.EndArray)
            throw new JsonException();

        return new AethernetShortcut
        {
            From = StringToEnum.TryGetValue(from, out var fromEnum) ? fromEnum : throw new JsonException(),
            To = StringToEnum.TryGetValue(to, out var toEnum) ? toEnum : throw new JsonException()
        };
    }

    public override void Write(Utf8JsonWriter writer, AethernetShortcut value, JsonSerializerOptions options)
    {
        writer.WriteStartArray();
        writer.WriteStringValue(EnumToString[value.From]);
        writer.WriteStringValue(EnumToString[value.To]);
        writer.WriteEndArray();
    }
}