﻿using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.Games.RpgMaterial.Common;

namespace JLGames.RocketDriver.Games.NetManager.Virtual
{
    public interface IVirtualServerProxy : IEventDispatcher
    {
        /// <summary>
        /// Handle client response request
        /// 处理客户端的响应请求
        /// </summary>
        /// <param name="protoId"></param>
        /// <param name="data"></param>
        void OnRequest(string protoId, object data);
    }

    public interface IVirtualServerExtension
    {
        /// <summary>
        /// Register extension
        /// 注册扩展
        /// </summary>
        /// <param name="protoId"></param>
        /// <param name="onProtoRequestHandler"></param>
        void RegisterExtension(string protoId, VirtualServerDelegate.OnProtoRequestHandler onProtoRequestHandler);

        /// <summary>
        /// Unregistered extension
        /// 解除注册的扩展
        /// </summary>
        /// <param name="protoId"></param>
        void UnregisterExtension(string protoId);

        /// <summary>
        /// Unregistered all extension
        /// 解除全部注册的扩展
        /// </summary>
        void UnregisterExtensions();
    }

    public interface IVirtualServer : IResponseServer, INotifyServer, IMaterialNotifyServer, INetServer
    {
        /// <summary>
        /// Start up the server
        /// 启动服务器
        /// </summary>
        void Startup();

        /// <summary>
        /// Shut down the server
        /// 关闭服务器
        /// </summary>
        void Shutdown();

        /// <summary>
        /// Reboot the server
        /// 重启服务器
        /// </summary>
        void Reboot();
    }

    public interface IResponseServer
    {
        /// <summary>
        /// Message response to client's message request
        /// 回复客户端的消息请求
        /// </summary>
        /// <param name="protoId"></param>
        /// <param name="resultCode"></param>
        /// <param name="data"></param>
        void ResponseToClient(string protoId, int resultCode, object data = null);
    }

    public interface INotifyServer
    {
        /// <summary>
        /// Message notify to client
        /// 向客户端发送消息推送
        /// </summary>
        /// <param name="protoId"></param>
        /// <param name="data"></param>
        void NotifyToClient(string protoId, object data = null);
    }

    public interface IMaterialNotifyServer
    {
        /// <summary>
        /// Notify Material Update - Offset 
        /// 通知材料更新 - 偏移
        /// </summary>
        /// <param name="offset"></param>
        void NotifyMaterialEntryUpdate(DataOffset offset);

        /// <summary>
        /// Notify Material Update - Number 
        /// 通知材料更新 - 数量
        /// </summary>
        /// <param name="num"></param>
        void NotifyMaterialEntryUpdate(DataNum num);

        /// <summary>
        /// Notify Material Update - Number and Offset
        /// 通知材料更新 - 偏移+数量
        /// </summary>
        /// <param name="notify"></param>
        void NotifyMaterialEntryUpdate(UserNotifyData notify);

        /// <summary>
        /// Notify Multiple Material Update - Offset
        /// 通知材料更新 - 偏移
        /// </summary>
        /// <param name="offsetArr"></param>
        void NotifyMaterialEntryUpdate(DataOffset[] offsetArr);

        /// <summary>
        /// Notify Multiple Material Update - Number
        /// 通知材料更新 - 数量
        /// </summary>
        /// <param name="numArr"></param>
        void NotifyMaterialEntryUpdate(DataNum[] numArr);

        /// <summary>
        /// Notify Multiple Material Update - Number and Offset
        /// 通知材料更新 - 偏移+数量
        /// </summary>
        /// <param name="notifyArr"></param>
        void NotifyMaterialEntryUpdate(UserNotifyData[] notifyArr);
    }
}