using System.Collections.Generic;
using System.Linq;
using DotRecast.Core.Collections;
using JNGame.Sync.Frame.Service;
using NotImplementedException = System.NotImplementedException;

namespace JNGame.Sync.System
{

    public class SDByteOperate
    {
        public static readonly byte[] DELETE = { 0 }; //删除

        public static bool IsDelete(byte[] value)
        {
            return value.Length == 1 && value[0] == DELETE[0];
        }
    }

    /// <summary>
    /// 数据接口
    /// </summary>
    public abstract class ISData : IJNSyncId
    {
        
        /// <summary>
        /// 数据唯一Id
        /// </summary>
        public long Id { get; set; }

        /// <summary>
        /// 判断是否一样
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public abstract bool IsEquals(ISData data);

    }

    public abstract class SDataSystemBase : SBaseSystem,IJNSyncCycle
    {
        public abstract void OnSyncStart();

        public abstract void OnSyncUpdate();
        
        public virtual void OnSyncDestroy()
        { }
    }
    
    /// <summary>
    /// 状态系统 - 数据层
    /// </summary>
    public abstract class SDataSystem<T> : SDataSystemBase where T : ISData,new()
    {
        
        //数据Id
        public long Id { get; private set; }
        
        public JNRandomSystem Random => GetSystem<JNRandomSystem>();

        //数据集
        public Dictionary<long, T> Data = new();

        public virtual T[] Datas {
            get
            {
                lock (Data)
                {
                    return Data.Values.ToArray();
                }
            }
        }

        public override void OnSyncStart()
        {
            //设置数据唯一Id
            Id = Random.NextId();
        }

        /// <summary>
        /// 返回最新数据 (收集最新的ISData数据 正常来讲只有服务端会运行)
        /// </summary>
        public virtual Dictionary<long, T> GetLatest()
        {
            return new ();
        }
        
    }
}