﻿using JLGames.RocketDriver.CSharp.Event;
using JLGames.RocketDriver.Games.NetManager.Virtual;
using JLGames.RocketDriver.Games.RpgMaterial.User;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgConst;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgTitle;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.Material
{
    public sealed class MaterialGiftbagService : GameMaterialServiceBase<IUserGiftbag, IMaterialGiftbag, CfgMaterialGiftbag>
        , IMaterialGiftbagService
    {
        private GroupGiftbagDetail m_GroupGiftbagDetail;

        public MaterialGiftbagService() : base(ConstMaterialType.Giftbag, false)
        {
        }

        // IMaterialGiftbagService

        public ExtGiftbagDetail GetGiftbagDetail(int id)
        {
            return m_GroupGiftbagDetail.GetById(id);
        }

        public void OpenGiftbag(int id, int batch = 1)
        {
            OpenGiftbag(new GiftbagParam {Id = id, BatchCount = batch});
        }

        public void OpenGiftbag(GiftbagParam param)
        {
            if (param.BatchCount <= 0 || m_GroupGiftbagDetail.GetById(param.Id) == null) return;
            ClientProxy.Request(ProtoReqIds.ProtoOpenGiftbag, param);
        }

        public void OpenGiftbagSome(GiftbagParams @params)
        {
            if (@params.Params == null || @params.Params.Length == 0) return;
            ClientProxy.Request(ProtoReqIds.ProtoOpenGiftbagSome, @params);
        }

        // IUserMaterialGenerator

        public override IUserMaterial GenUserMaterial(int mid, int num = 0)
        {
            var rs = new UserGiftbag();
            rs.SetType(MaterialType);
            rs.SetMId(mid);
            rs.SetNum(num);
            return rs;
        }

        // IClearService, IInitService

        public override void Clear()
        {
            RemoveNetListeners();
            RemoveNotifyListeners();
            m_UserMaterials = null;
            m_Materials = null;
            base.Clear();
        }

        public void Init()
        {
            InitService();
            var set = InitMaterialData<MaterialGiftbag>(ConstCfgData.MaterialGiftbag);
            m_Materials.UpdateSet(set);
            LoadCfgData();
            InvokeInited();
        }

        private void LoadCfgData()
        {
            var textJsonData = ServiceCenter.ConfigDataService.ExtractJsonContext(ConstCfgData.Giftbag);
            m_GroupGiftbagDetail = new GroupGiftbagDetail();
            m_GroupGiftbagDetail.SetData(textJsonData);
        }

        public void InitData()
        {
            AddNotifyListeners();
            AddNetListeners();
            InvokeDataInited();
        }

        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.ProtoOpenGiftbag:
                    DispatchEvent(MaterialGiftbagServiceEvents.OnRespOpen, resp);
                    break;
                case ProtoReqIds.ProtoOpenGiftbagSome:
                    DispatchEvent(MaterialGiftbagServiceEvents.OnRespOpenSome, resp);
                    break;
            }
        }
    }
}