﻿using Game.Cfg.CfgConst;
using JLGames.RocketDriver.Games.NetManager;
using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.CSharp.Service;
using JLGames.RocketDriver.Games.NetManager.Virtual;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgConst;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.GM
{
    public sealed class GmService : GameServiceBase, IGmService, IInitService
    {
        public void InsertMaterial(int mType, int mId, uint num)
        {
            var @params = $"{mType}_{mId}_{num}";
            ClientProxy.Request(ProtoGmReqIds.ProtoMaterialInsert, @params);
        }

        public void UpdateMaterial(int mType, int mId, uint num)
        {
            var @params = $"{mType}_{mId}_{num}";
            ClientProxy.Request(ProtoGmReqIds.ProtoMaterialUpdate, @params);
        }

        public void DeleteMaterial(int mType, int id, int num)
        {
            var @params = $"{mType}_{id}_{num}";
            ClientProxy.Request(ProtoGmReqIds.ProtoMaterialDelete, @params);
        }

        public void DeleteMaterial(int mType, int id)
        {
            var @params = $"{mType}_{id}";
            ClientProxy.Request(ProtoGmReqIds.ProtoMaterialDelete, @params);
        }

        // IClearService, IInitService

        public void Init()
        {
            AddNetListeners();
            InvokeInited();
        }

        public override void Clear()
        {
            RemoveNetListeners();
            base.Clear();
        }

        private void AddNetListeners()
        {
            ClientProxy.AddEventListener(VirtualClientEvents.EventResponse, OnResponse);
        }

        private void RemoveNetListeners()
        {
            ClientProxy.RemoveEventListener(VirtualClientEvents.EventResponse, OnResponse);
        }

        private void OnResponse(EventData evd)
        {
            var resp = (VirtualClientResponse) evd.Data;
            switch (resp.Pid)
            {
                case ProtoGmReqIds.ProtoMaterialInsert:
                    DispatchEvent(GmServiceEvents.EventOnMaterialInsert, resp);
                    break;
                case ProtoGmReqIds.ProtoMaterialUpdate:
                    DispatchEvent(GmServiceEvents.EventOnMaterialUpdate, resp);
                    break;
                case ProtoGmReqIds.ProtoMaterialDelete:
                    DispatchEvent(GmServiceEvents.EventOnMaterialDelete, resp);
                    break;
            }
        }
    }
}