//#define TestMode
using System;
using Server.Items;
using Server.Network;

namespace Server.Gumps
{
	public class NewMinerBonusGump : Gump
	{
		private readonly TurboSlot m_Slot;
		private readonly int[] m_Symbols;
        private int m_TotalWon;

        private readonly int[] buttonx = new int[] { 86, 156, 140, 205, 242, 359, 158, 245, 399 };
        private readonly int[] buttony = new int[] { 198, 158, 236, 85, 142, 98, 309, 107, 363 };
        private readonly bool[] m_b;
        private readonly int[] m_c;

		public NewMinerBonusGump( TurboSlot Slot, int[] Symbols, bool initialize, bool[] b, int[] c, int totalwon ) : base( 25, 25 )
		{
			m_Slot = Slot;
			m_Symbols = Symbols;
            m_b = b;
            m_c = c;
            m_TotalWon = totalwon;
            if (initialize)
            {
                double zerochance = .40;
                bool fiftyk = false;
                for (int i = 0; i < 9; i++)
                {
                    b[i] = false;
                    if (fiftyk || ( i == 3 && 0.10 < Utility.RandomDouble())) // Only allow one fifty K spot and worsen the odds and rarely on the top button! :P
                    {
                        if (zerochance < Utility.RandomDouble())
                            c[i] = Utility.RandomList(5000, 5000, 1000, 1000, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50);
                        else
                            c[i] = 0;
                        if (i == 1) c[i] = 111;
                    }
                    else
                    {
                        if (zerochance < Utility.RandomDouble())
                            c[i] = Utility.RandomList(50000, 10000, 5000, 5000, 1000, 1000, 1000, 1000, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 100, 100, 100, 100, 100, 100, 100, 100, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50);
                        else
                            c[i] = 0;
                        if (c[i] == 50000)
                        {
                            fiftyk = true;
                            zerochance += .28;
                        }
                    }
                    if (c[i] != 0)
                            zerochance += .05;
                }
            }
            Disposable = true;
            Dragable = true;
            Closable = true;
            for (int i = 0; i < 9; i++)
            {
                if (!b[i])
                {
                    Disposable = false;
                    Dragable = true;
                    Closable = false;
                    break;
                }
            }
			Resizable=false;
			AddPage(0);
			AddBackground(52, 25, 393, 430, 5120);
			AddImage(59, 63, 5528);
			AddImage(60, 30, 5573);
			AddLabel(123, 26, 1149, @"Pick a location to mine, If you mine up coal you lose.");
			AddLabel(123, 42, 1149, @"You keep mining till you find coal or all are gone.");

            for (int i = 0; i < 9; i++)
            {
                if (!b[i])
                {
                    AddButton(buttonx[i], buttony[i], 2117, 2118, i + 1, GumpButtonType.Reply, 0);
#if TestMode 
                    if (m_Slot.TestMode)
                        AddLabel(buttonx[i], buttony[i]+ 10, 1160, c[i].ToString());
#endif
                }
                else
                {
                    AddImage(buttonx[i], buttony[i], 5231);
                    if (c[i] != 0)
                        AddLabel(buttonx[i], buttony[i], 1160, c[i].ToString());
                    else
                        AddLabel(buttonx[i], buttony[i], 1160, @"!! Coal !!");
                }
            }
		}

        public override void OnResponse(NetState state, RelayInfo info)
        {
            Mobile from = state.Mobile;

            if (from == null)
                return;
            if (m_Slot.InUseBy == null)
            {
                from.SendMessage("Someone else played this machine while you were idle. Double click it again to resume play.");
                return;
            }
            if (from.Serial != m_Slot.InUseBy.Serial)
            {
                from.SendMessage("You have left this machine idle too long and {0} has taken it over!", m_Slot.InUseBy.Name);
                return;
            }
            if (info.ButtonID < 0 || info.ButtonID > 10)
            {
                from.SendMessage("Invalid button detected, using Razor maybe? Bonus round over.");
                from.CloseGump(typeof(TurboSlotGump));
                from.SendGump(new TurboSlotGump(m_Slot, m_Symbols));
                return;
            }
            m_Slot.LastPlayed = DateTime.Now;
            if (info.ButtonID == 0)
            {
                from.CloseGump(typeof(TurboSlotGump));
                from.SendGump(new TurboSlotGump(m_Slot, m_Symbols));
                return;
            }
            int buttonindex = info.ButtonID - 1;
            if (m_c[buttonindex] == 0)
            {
                from.SendMessage("You found coal!");
                from.SendMessage("You may now close this menu out to continue playing.");
                from.SendGump(new NewMinerBonusGump(m_Slot, m_Symbols, false, new bool[] { true, true, true, true, true, true, true, true, true }, m_c, m_TotalWon));
                if (m_TotalWon == 0)
                    m_Slot.PublicOverheadMessage(0, m_Slot.Hue, false, "Bonus Round Over");
                else
                {
                    string text = String.Format("Bonus Round: {0} gold!", m_TotalWon);
                    m_Slot.PublicOverheadMessage(0, m_Slot.Hue, false, text);
                }
            }
            else
            {
                if (m_b[buttonindex])
                {
                    m_Slot.Active = false;
                    m_Slot.SlotWon = 0;
                    m_Slot.ErrorCode = 9001; 
                    from.SendMessage("An Invalid choice has been detected and a Casino Boss has been notified.");
                    from.SendMessage("Trying to cheat? Expect a visit shortly! No gold for you!");
                    from.SendMessage("This slot machine is offline for maintenance.");
                    return;
                }
                m_Slot.SlotWon += m_c[buttonindex];
                m_Slot.LastPay += m_c[buttonindex];
                m_TotalWon += m_c[buttonindex];
                from.SendMessage("You have won {0}, pick another spot to mine.", m_c[buttonindex]);
                m_b[buttonindex] = true;
                from.SendGump(new NewMinerBonusGump(m_Slot, m_Symbols, false, m_b, m_c, m_TotalWon));
            }

        }
	}
}