using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PlanTempus.Core.Configurations.Common
{

    using Newtonsoft.Json.Linq;
    using System.Collections.Generic;

    public static class KeyValueToJson
    {
        public static JObject Convert(IEnumerable<KeyValuePair<string, JToken>> pairs)
        {
            var root = new JObject();

            foreach (var pair in pairs)
            {
                var keys = pair.Key.Split(':');
                var current = root;

                // Gennemgå hierarkiet og opret underobjekter, hvis de ikke eksisterer
                for (int i = 0; i < keys.Length - 1; i++)
                {
                    var key = keys[i];

                    if (current[key] == null)
                    {
                        current[key] = new JObject();
                    }

                    current = (JObject)current[key];
                }

                // Håndter den sidste nøgle og tilføj værdien
                var lastKey = keys[keys.Length - 1];
                var value = ConvertValue(pair.Value);

                // Hvis den sidste nøgle allerede eksisterer, tilføj til en liste
                if (current[lastKey] != null)
                {
                    // Hvis den allerede er en liste, tilføj til listen
                    if (current[lastKey].Type == JTokenType.Array)
                    {
                        ((JArray)current[lastKey]).Add(value);
                    }
                    // Hvis den ikke er en liste, konverter til en liste
                    else
                    {
                        var existingValue = current[lastKey];
                        current[lastKey] = new JArray { existingValue, value };
                    }
                }
                // Ellers tilføj som en enkelt værdi
                else
                {
                    current[lastKey] = value;
                }
            }

            return root;
        }

        private static JToken ConvertValue(object value)
        {
            // Hvis værdien allerede er en JToken, returner den direkte
            if (value is JToken token)
            {
                return token;
            }

            // Konverter andre typer
            return value switch
            {
                int i => new JValue(i),
                double d => new JValue(d),
                bool b => new JValue(b),
                string s => new JValue(s),
                _ => new JValue(value.ToString())
            };
        }
    }
}