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

namespace BaSys40.Models.Export
{
    public class AssetAdministrationShellEnvironmentConverter : JsonConverter
    {
        //public override bool CanWrite => true;
        //public override bool CanRead => false;

        public override bool CanConvert(Type objectType)
        {
            if (typeof(IAssetAdministrationShell).IsAssignableFrom(objectType))
                return true;
            else
                return false;
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            JObject jObj = new JObject();
            Type type = value.GetType();

            foreach (PropertyInfo prop in type.GetProperties())
            {
                object propVal = prop.GetValue(value);
                if (propVal != null)
                {
                    var attrib = prop.GetCustomAttribute(typeof(ExportAsReferenceAttribute), true);
                    var propName = prop.Name.Substring(0, 1).ToLower() + prop.Name.Substring(1, prop.Name.Length - 1);
                    if (attrib != null)
                    {
                        var exportAttrib = (ExportAsReferenceAttribute)attrib;
                        if (propVal != null)
                        {
                            if (typeof(IIdentifiable).IsAssignableFrom(propVal.GetType()))
                            {
                                IIdentifiable identifiable = propVal as IIdentifiable;
                                if (identifiable.Identification?.Id != null)
                                {
                                    IReference reference = new Reference(new ModelKey(exportAttrib.KeyElement, identifiable.Identification.IdType.Value, identifiable.Identification.Id));
                                    jObj.Add(propName, JToken.FromObject(reference, serializer));
                                }
                                continue;
                            }
                            if(propVal is IEnumerable)
                            {
                                JArray jArray = new JArray();
                                IEnumerable<IIdentifiable> identifiables = (IEnumerable<IIdentifiable>)propVal;
                                foreach (var identifiable in identifiables)
                                {
                                    if (identifiable.Identification?.Id != null)
                                    {
                                        IReference reference = new Reference(new ModelKey(exportAttrib.KeyElement, identifiable.Identification.IdType.Value, identifiable.Identification.Id));
                                        jArray.Add(JToken.FromObject(reference, serializer));
                                    }
                                }
                                jObj.Add(propName, jArray);
                                continue;
                            }
                        }
                    }
                    jObj.Add(propName, JToken.FromObject(propVal, serializer));
                }
            }
            jObj.WriteTo(writer);
        }
    }
}
