/*******************************************************************************
* Copyright (c) 2020, 2021 Robert Bosch GmbH
* Author: Constantin Ziesche (constantin.ziesche@bosch.com)
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
using BaSyx.Models.Core.AssetAdministrationShell.Generics;
using BaSyx.Models.Core.AssetAdministrationShell.Identification;
using BaSyx.Models.Core.Common;
using Newtonsoft.Json;
using System;
using System.Runtime.Serialization;

namespace BaSyx.Models.Core.AssetAdministrationShell.Implementations
{
    ///<inheritdoc cref="IProperty"/>
    [DataContract]
    public class Property : SubmodelElement, IProperty
    {
        public override ModelType ModelType => ModelType.Property;

        /// <summary>
        /// Only internal temporary storage of the current value. 
        /// Get and Set operations shall only be processed via its respective handler.
        /// </summary>
        protected object _value;

        public virtual object Value
        {
            get
            {
                return Get?.Invoke(this)?.Value;
            }            
            set
            {
                if (value != null)
                {
                    if (value is IValue iValue)
                        Set?.Invoke(this, iValue);
                    else
                        Set?.Invoke(this, new ElementValue(value, ValueType));                   
                }
            }
        }

        [DataMember(EmitDefaultValue = false, IsRequired = false, Name = "valueType")]
        public virtual DataType ValueType { get; set; }
        public IReference ValueId { get; set; }

        public event EventHandler<ValueChangedArgs> ValueChanged;

        public Property(string idShort) : this(idShort, null, null)
        { }

        public Property(string idShort, DataType valueType) : this(idShort, valueType, null)
        { }

        [JsonConstructor]
        public Property(string idShort, DataType valueType, object value) : base(idShort)
        {
            ValueType = valueType;

            if (value != null)
            {
                if (ValueType == null)
                {
                    _value = value;
                    ValueType = new DataType(DataObjectType.None);
                }
                else if (value.GetType() == valueType.SystemType)
                    _value = value;
                else
                    _value = ElementValue.ToObject(value, valueType.SystemType);
            }

            Get = element  => 
            { 
                return new ElementValue(_value, ValueType); 
            };

            Set = (element, iValue) => 
            { 
                _value = iValue.Value;
                OnValueChanged(new ValueChangedArgs(IdShort, _value, ValueType));
            };
        }

        public T ToObject<T>()
        {
            return new ElementValue(Value, ValueType).ToObject<T>();
        }

        public object ToObject(Type type)
        {
            return new ElementValue(Value, ValueType).ToObject(type);
        }

        protected virtual void OnValueChanged(ValueChangedArgs e)
        {
            ValueChanged?.Invoke(this, e);
        }
    }
    ///<inheritdoc cref="IProperty"/>
    [DataContract]
    public class Property<TInnerType> : Property, IProperty<TInnerType>
    {
        public override ModelType ModelType => ModelType.Property;
        public override DataType ValueType => typeof(TInnerType);
       
        [JsonIgnore, IgnoreDataMember]
        public virtual new TInnerType Value
        {
            get
            {
                if (Get != null)
                    return Get.Invoke(this);
                else
                    return default;
            }
            set
            {
                if (value != null)
                {
                    Set?.Invoke(this, value);                                       
                }
            }
        }

        private GetValueHandler<TInnerType> _get;
        private SetValueHandler<TInnerType> _set;

        [JsonIgnore, IgnoreDataMember]
        public new GetValueHandler<TInnerType> Get 
        {
            get => _get;
            set
            {
                _get = value;
                if (value != null)
                    base.Get = new GetValueHandler(element => new ElementValue<TInnerType>(_get.Invoke(element)));
                else
                    base.Get = null;
            }
        }
        [JsonIgnore, IgnoreDataMember]
        public new SetValueHandler<TInnerType> Set 
        {
            get => _set;
            set
            {
                _set = value;
                if (value != null)
                    base.Set = new SetValueHandler((element, iValue) =>
                    {
                        TInnerType typedValue = iValue.ToObject<TInnerType>();
                        _set.Invoke(element, typedValue);
                        OnValueChanged(new ValueChangedArgs(IdShort, typedValue, ValueType));
                    });
                else
                    base.Set = null;
            }
        }

        public Property(string idShort) : this(idShort, default) { }

        [JsonConstructor]
        public Property(string idShort, TInnerType value) : base(idShort, typeof(TInnerType), value) 
        {
            _get = element =>
            {
                if (base.Get != null)
                    return base.Get.Invoke(element).ToObject<TInnerType>();
                else
                    return default;
            };
            _set = (element, iValue) => { base.Set?.Invoke(element, new ElementValue<TInnerType>(iValue)); };
        }

    }
}
