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

namespace JLGames.RocketDriver.Samples.RpgMaterialDemo.Server
{
    internal static class ExchangeExtension
    {
        /// <summary>
        /// 单项兑换 
        /// </summary>
        /// <param name="server"></param>
        /// <param name="protoId"></param>
        /// <param name="data"></param>
        public static void HandleExchange(IVirtualServer server, string protoId, object data)
        {
            var param = (ExchangeParam) data;
            var define = ServiceCenter.ExchangeService.GetExchangeItem(param.Id);
            if (null == define)
            {
                DebugUtil.LogWarning("非法兑换：", param.Id);
                return;
            }

            var sources = define.Sources;
            var index = GameMaterialUtils.CheckEnoughs(sources);
            if (index != -1)
            {
                server.ResponseToClient(protoId, VirtualResultCodes.FailLack, sources[index]);
                return;
            }

            var offsets = sources.Append(define.Targets, true);
            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 HandleExchangeSome(IVirtualServer server, string protoId, object data)
        {
            var some = (ExchangeParams) data;
            var mergedOffsets = new DataOffset[0];
            foreach (var @param in some.Params)
            {
                var define = ServiceCenter.ExchangeService.GetExchangeItem(@param.Id);
                if (null == define)
                {
                    DebugUtil.LogWarning("非法兑换：", @param.Id);
                    return;
                }

                mergedOffsets = mergedOffsets.Append(define.Sources).Append(define.Targets);
            }

            mergedOffsets = mergedOffsets.Merged();
            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);
        }
    }
}