using System;
using System.Globalization;
using System.Text.Json.Serialization;
using System.Text.Json;
using AsbCloudApp.Data.GTR;

namespace AsbCloudWebApi.Converters;

public class JsonValueJsonConverter : JsonConverter<JsonValue>
{
    public override JsonValue Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            var stringVal = reader.GetString() ?? string.Empty;
            return new JsonValue(stringVal);
        }

        if (reader.TokenType == JsonTokenType.Number)
        {
            if (reader.TryGetInt32(out int intVal))
                return new JsonValue(intVal);

            if (reader.TryGetDouble(out double doubleVal))
                return new JsonValue((float)doubleVal);
        }

        throw new FormatException($"Wrong format at position {reader.Position}");
    }

    public override void Write(Utf8JsonWriter writer, JsonValue value, JsonSerializerOptions options)
    {
        if (value.Value is string strValue)
        {
            writer.WriteStringValue(FormatString(strValue));
            return;
        }

        if (value.Value is int intValue)
        {
            writer.WriteNumberValue(intValue);
            return;
        }

        if (value.Value is short shortValue)
        {
            writer.WriteNumberValue(shortValue);
            return;
        }

        if (value.Value is float floatValue)
        {
            writer.WriteRawValue(floatValue.ToString("#0.0##", CultureInfo.InvariantCulture), true);
            return;
        }

        if (value.Value is double doubleValue)
        {
            writer.WriteRawValue(doubleValue.ToString("#0.0##", CultureInfo.InvariantCulture), true);
            return;
        }

        var typeName = value.Value.GetType().Name;
        throw new NotImplementedException($"{typeName} is not supported type for WITS value");
    }

    private static string FormatString(string value)
    => value
        .Replace("\"", "")
        .Trim()
        .Replace("\r", "")
        .Replace("\n", "");
}