using CommonAI.Zone.Instance;
using System;
using System.Collections.Generic;
using System.Text;

namespace CommonAI.Zone.Helper
{

    public class DropItemGenerator
    {
        class DropList
        {
            private readonly float AllPct;
            private readonly DropItem[] Items;

            public DropList(List<DropItem> items)
            {
                this.Items = new DropItem[items.Count];
                float total = 0;
                for (int i = 0; i < items.Count; i++)
                {
                    Items[i] = items[i];
                    total += items[i].DropPercent;
                }
                this.AllPct = total;
            }

            public DropItem DropOnce(Random random)
            {
                for (int i = 0; i < Items.Length; i++)
                {
                    int r = random.Next(0, Items.Length);
                    Items[i] = Items[r];
                }
                float seed = (float)(random.NextDouble() * 100f);
                float begin = 0;
                for (int i = 0; i < Items.Length; i++)
                {
                    float end = begin + Items[i].DropPercent;
                    if (begin <= seed && seed <= end)
                    {
                        return Items[i];
                    }
                    begin = end;
                }
                return null;
            }
        }

        private DropList[] Drops;
        private List<KeyValuePair<ItemTemplate, DropItem>> ret;

        public DropItemGenerator(List<DropItemList> drops)
        {
            if (drops != null)
            {
                this.Drops = new DropList[drops.Count];
                for (int i = 0; i < drops.Count; i++)
                {
                    Drops[i] = new DropList(drops[i].DropItems);
                }
                this.ret = new List<KeyValuePair<ItemTemplate, DropItem>>(drops.Count);
            }
            else
            {
                this.Drops = new DropList[0];
                this.ret = new List<KeyValuePair<ItemTemplate, DropItem>>(0);
            }
        }


        public IEnumerable<KeyValuePair<ItemTemplate, DropItem>> Drop(InstanceZone zone, Random random)
        {
            ret.Clear();
            for (int i = 0; i < Drops.Length; i++)
            {
                DropItem drop = Drops[i].DropOnce(random);
                if (drop != null)
                {
                    ItemTemplate template = zone.Templates.getItem(drop.ItemTemplateID);
                    if (template != null)
                    {
                        for (int c = 0; c < drop.DropCount; c++)
                        {
                            KeyValuePair<ItemTemplate, DropItem> e = new KeyValuePair<ItemTemplate, DropItem>(template, drop);
                            ret.Add(e);
                        }
                    }
                }
            }
            return ret;
        }

    }

}