// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

namespace HoloToolkit.Sharing.SyncModel
{
    /// <summary>
    /// This class implements the double primitive for the syncing system.
    /// It does the heavy lifting to make adding new doubles to a class easy.
    /// </summary>
    public class SyncDouble : SyncPrimitive
    {
        private DoubleElement element;
        private double value;

#if UNITY_EDITOR
        public override object RawValue
        {
            get { return value; }
        }
#endif

        public double Value
        {
            get { return value; }

            set
            {
                // Has the value actually changed?
                if (this.value != value)
                {
                    // Change the value
                    this.value = value;

                    if (element != null)
                    {
                        // Notify network that the value has changed
                        element.SetValue(value);
                    }
                }
            }
        }

        public SyncDouble(string field) : base(field) { }

        public override void InitializeLocal(ObjectElement parentElement)
        {
            element = parentElement.CreateDoubleElement(XStringFieldName, value);
            NetworkElement = element;
        }

        public void AddFromLocal(ObjectElement parentElement, double localValue)
        {
            InitializeLocal(parentElement);
            Value = localValue;
        }

        public override void AddFromRemote(Element remoteElement)
        {
            NetworkElement = remoteElement;
            element = DoubleElement.Cast(remoteElement);
            value = element.GetValue();
        }

        public override void UpdateFromRemote(double remoteValue)
        {
            value = remoteValue;
        }
    }
}