﻿using BaSys40.Models.Core.AssetAdministrationShell.Enums;
using BaSys40.Models.Core.AssetAdministrationShell.Generics;
using BaSys40.Models.Core.Attributes;
using BaSys40.Models.Core.Extensions.References;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Reflection;

namespace BaSys40.Models.Core.AssetAdministrationShell.Implementations
{
    public class DataElementValueConverter : JsonConverter<IDataElement>
    {
        static Dictionary<string, Type> DataElementInformationTypes;
        static DataElementValueConverter()
        {
            DataElementInformationTypes = new Dictionary<string, Type>();
            var types = typeof(DataElementValueConverter).Assembly.GetTypes();
            foreach (Type type in types)
            {
                var attrib = type.GetCustomAttribute(typeof(DataSpecificationAttribute), false);
                if(attrib != null && attrib is DataSpecificationAttribute dataSpecificationAttribute)
                {
                    DataElementInformationTypes.Add(dataSpecificationAttribute.Reference.First.Value, type);
                }
            }

        }

        public override bool CanWrite => false;
        public override bool CanRead => true;

        public override IDataElement ReadJson(JsonReader reader, Type objectType, IDataElement existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            JObject jObject;

            try
            {
                jObject = JObject.Load(reader);
            }
            catch (Exception)
            {
                return null;
            }

            var modelTypeToken = jObject.SelectToken("modelType")?.ToObject<ModelType>();
            var valueTypeToken = jObject.SelectToken("valueType")?.ToObject<DataType>();
            var embeddedDataSpecificationsToken = jObject.SelectToken("embeddedDataSpecifications");
            var conceptDescriptionToken = jObject.SelectToken("conceptDescription");

            IDataElement dataElement;
            List<IEmbeddedDataSpecification> embeddedDataSpecifications = null;
            ConceptDescription conceptDescription = null;
            var embeddedDataSpecificationsTokenChildToken = embeddedDataSpecificationsToken?.Children();
            if (embeddedDataSpecificationsTokenChildToken != null) //
            {
                embeddedDataSpecifications = new List<IEmbeddedDataSpecification>();
                foreach (var dataSpecificationToken in embeddedDataSpecificationsTokenChildToken)
                {
                    var dataSpecReference = dataSpecificationToken.SelectToken("hasDataSpecification")?.ToObject<Reference>();
                    if (dataSpecReference != null && DataElementInformationTypes.TryGetValue(dataSpecReference.First.Value, out Type type))
                    {
                        var content = dataSpecificationToken.SelectToken("dataSpecificationContent")?.ToObject(type);
                        if (content != null)
                            embeddedDataSpecifications.Add((IEmbeddedDataSpecification)content);
                    }
                }
                jObject.Remove("embeddedDataSpecifications");
            }
            if(conceptDescriptionToken != null)
            {
                var dataSpecifications = conceptDescriptionToken.SelectToken("embeddedDataSpecifications")?.Children();
                if(dataSpecifications != null)
                {
                    conceptDescription.EmbeddedDataSpecifications = new List<IEmbeddedDataSpecification>();
                    foreach (var dataSpecificationToken in dataSpecifications)
                    {
                        var dataSpecReference = dataSpecificationToken.SelectToken("hasDataSpecification")?.ToObject<Reference>();
                        if (dataSpecReference != null && DataElementInformationTypes.TryGetValue(dataSpecReference.First.Value, out Type type))
                        {
                            var content = dataSpecificationToken.SelectToken("dataSpecificationContent")?.ToObject(type);
                            if (content != null)
                                conceptDescription.EmbeddedDataSpecifications.Add((IEmbeddedDataSpecification)content);
                        }
                    }
                }
                serializer.Populate(conceptDescriptionToken.CreateReader(), conceptDescription);
            }

            if (modelTypeToken != null)
                dataElement = DataElementFactory.CreateDataElement(conceptDescription, embeddedDataSpecifications, modelTypeToken, valueTypeToken);
            else
                return null;
            
            serializer.Populate(jObject.CreateReader(), dataElement);

            return dataElement;            
        }

        public override void WriteJson(JsonWriter writer, IDataElement value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
}
