﻿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.MaterialExtend.Exchange
{
    public sealed class ExchangeService : GameServiceBase, IExchangeService, IInitService
    {
        private GroupExchange m_GroupExchange;

        // IExchangeService

        public ExtExchange GetExchangeItem(int id)
        {
            return m_GroupExchange.GetById(id);
        }

        public void ExecuteExchange(int id, int batch = 1)
        {
            var @params = new ExchangeParam() {Id = id, BatchCount = batch};
            ExecuteExchange(@params);
        }

        public void ExecuteExchange(ExchangeParam one)
        {
            ClientProxy.Request(ProtoReqIds.ProtoExchang, one);
        }

        public void ExecuteExchange(ExchangeParams some)
        {
            ClientProxy.Request(ProtoReqIds.ProtoExchangSome, some);
        }

        // IClearService, IInitService

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

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

        private void LoadCfgData()
        {
            var textJsonData = ServiceCenter.ConfigDataService.ExtractJsonContext(ConstCfgData.Exchange);
            m_GroupExchange = new GroupExchange();
            m_GroupExchange.SetData(textJsonData);
        }

        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 ProtoReqIds.ProtoExchang:
                    DispatchEvent(ExchangeServiceEvents.OnRespExchange, resp);
                    break;
                case ProtoReqIds.ProtoExchangSome:
                    DispatchEvent(ExchangeServiceEvents.OnRespExchangeSome, resp);
                    break;
            }
        }
    }
}