using FishNet.Managing;
using FishNet.Serializing;
using System;

namespace FishNet.Object.Synchronizing.Internal
{
    /// <summary>
    /// A sync object is an object that can synchronize it's state
    /// between server and client, such as a SyncList
    /// </summary>
    public interface ISyncType
    {
        /// <summary>
        /// true if there are changes since the last flush
        /// </summary>
        bool IsDirty { get; }
        /// <summary>
        /// Sets index for the SyncType.
        /// </summary>
        void SetRegistered();
        /// <summary>
        /// PreInitializes this for use with the network.
        /// </summary>
        void PreInitialize(NetworkManager networkManager);
        /// <summary>
        /// Writes all changed values.
        /// </summary>
        /// <param name="writer"></param>
        ///<param name="resetSyncTick">True to set the next time data may sync.</param>
        void WriteDelta(PooledWriter writer, bool resetSyncTick = true);
        /// <summary>
        /// Writers all values if not initial values.
        /// </summary>
        /// <param name="writer"></param>
        void WriteFull(PooledWriter writer);
        /// <summary>
        /// Sets current values.
        /// </summary>
        /// <param name="reader"></param>
        void Read(PooledReader reader);
        /// <summary>
        /// Resets the SyncObject so that it can be re-used
        /// </summary>
        void Reset();
    }


}