﻿using JLGames.RocketDriver.Actions.Utils;
using JLGames.RocketDriver.Games.NetManager.Virtual;
using JLGames.RocketDriver.Games.RpgMaterial.Common;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Cfg.CfgConst;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Service;
using JLGames.RocketDriver.Samples.RpgMaterialDemo.Service.Material;

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Server
{
    internal static class MaterialGiftbagExtension
    {
        /// <summary>
        /// 单项兑换 
        /// </summary>
        /// <param name="server"></param>
        /// <param name="protoId"></param>
        /// <param name="data"></param>
        public static void HandleOpen(IVirtualServer server, string protoId, object data)
        {
            var param = (GiftbagParam) data;
            var service = ServiceCenter.MaterialGiftbagService;
            var define = service.GetGiftbagDetail(param.Id);
            if (null == define)
            {
                DebugUtil.LogWarning("非法礼包：", param.Id);
                return;
            }

            var num = service.GetUserMaterialNum(param.Id);
            if (num < param.BatchCount)
            {
                server.ResponseToClient(protoId, VirtualResultCodes.FailLack, param.Id);
                return;
            }

            var offsets = define.RandToDataOffsets().Append(new DataOffset(ConstMaterialType.Giftbag, param.Id, 0, -param.BatchCount)).ClearByZero();
            server.NotifyMaterialEntryUpdate(offsets);
            server.ResponseToClient(protoId, VirtualResultCodes.Succ, offsets);
        }

        /// <summary>
        /// 多项批量兑换
        /// </summary>
        /// <param name="server"></param>
        /// <param name="protoId"></param>
        /// <param name="data"></param>
        public static void HandleOpenSome(IVirtualServer server, string protoId, object data)
        {
            var some = (GiftbagParams) data;
            var service = ServiceCenter.MaterialGiftbagService;
            var mergedOffsets = new DataOffset[0];
            foreach (var @param in some.Params)
            {
                var define = service.GetGiftbagDetail(param.Id);
                if (null == define)
                {
                    DebugUtil.LogWarning("非法礼包：", @param.Id);
                    return;
                }

                mergedOffsets = mergedOffsets.Append(define.RandToDataOffsets())
                    .Append(new DataOffset(ConstMaterialType.Giftbag, param.Id, 0, -param.BatchCount));
            }

            mergedOffsets = mergedOffsets.Merged().ClearByZero();
            var checkOffsets = mergedOffsets.GetSome(offset => offset.Offset < 0);
            var index = GameMaterialUtils.CheckEnoughs(checkOffsets);
            if (index != -1)
            {
                server.ResponseToClient(protoId, VirtualResultCodes.FailLack, checkOffsets[index].Id);
                return;
            }

            server.NotifyMaterialEntryUpdate(mergedOffsets);
            server.ResponseToClient(protoId, VirtualResultCodes.Succ, mergedOffsets);
        }
    }
}