using System;
using Server;
using Server.Gumps;
using Server.Multis;
using Server.Network;
using Server.Targeting;
using Server.Engines.VeteranRewards;

namespace Server.Items
{	
	public class WallBannerComponent : AddonComponent, IDyable
	{
		public override bool NeedsWall{ get{ return true; } }
		public override Point3D WallPosition{ get{ return this.East ? new Point3D( -1, 0, 0 ) : new Point3D( 0, -1, 0 ); } }

		public bool East{ get { return ((WallBanner)Addon).East; } }

		public WallBannerComponent( int itemID ) : base( itemID )
		{
		}

		public WallBannerComponent( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.WriteEncodedInt( 0 ); // version
		}
			
			public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadEncodedInt();
		}
		
		public bool Dye( Mobile from, DyeTub sender )
		{
			if ( Deleted )
				return false;

			if ( Addon != null )
				Addon.Hue = sender.DyedHue;

			return true;
		}
	}

	public class WallBanner : BaseAddon, IRewardItem
	{
		public override BaseAddonDeed Deed
		{ 
			get
			{ 
				WallBannerDeed deed = new WallBannerDeed();
				deed.IsRewardItem = m_IsRewardItem;

				return deed;	
			} 
		}

		private bool m_IsRewardItem;

		[CommandProperty( AccessLevel.GameMaster )]
		public bool IsRewardItem
		{
			get{ return m_IsRewardItem; }
			set{ m_IsRewardItem = value; InvalidateProperties(); }
		}
		
		private bool m_East;

		[CommandProperty( AccessLevel.GameMaster )]
		public bool East
		{
			get{ return m_East; }
			set{ m_IsRewardItem = value; InvalidateProperties(); }
		}
		
		[Constructable]
		public WallBanner( int bannerID ) : base()
		{
			m_East = ((bannerID % 2) == 1 );

			switch ( bannerID )
			{
				case 1: 
					AddComponent( new WallBannerComponent( 0x161F ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x161E ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x161D ), 0, 2, 0 );
					break;
				case 2: 
					AddComponent( new WallBannerComponent( 0x1586 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1587 ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1588 ), 2, 0, 0 );
					break;
				case 3: 
					AddComponent( new WallBannerComponent( 0x1622 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1621 ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x1620 ), 0, 2, 0 );
					break;
				case 4: 
					AddComponent( new WallBannerComponent( 0x1589 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x158A ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x158B ), 2, 0, 0 );
					break;
				case 5: 
					AddComponent( new WallBannerComponent( 0x1625 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1624 ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x1623 ), 0, 2, 0 );
					break;
				case 6: 
					AddComponent( new WallBannerComponent( 0x158C ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x158D ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x158E ), 2, 0, 0 );
					break;
				case 7: 
					AddComponent( new WallBannerComponent( 0x1628 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1627 ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x1626 ), 0, 2, 0 );
					break;
				case 8: 
					AddComponent( new WallBannerComponent( 0x1590 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1591 ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x158F ), 2, 0, 0 );
					break;
				case 9: 
					AddComponent( new WallBannerComponent( 0x162A ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1629 ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x1626 ), 0, 2, 0 );
					break;
				case 10: 
					AddComponent( new WallBannerComponent( 0x1592 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1593 ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x158F ), 2, 0, 0 );
					break;
				case 11: 
					AddComponent( new WallBannerComponent( 0x162D ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x162C ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x162B ), 0, 2, 0 );
					break;
				case 12: 
					AddComponent( new WallBannerComponent( 0x1594 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1595 ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1596 ), 2, 0, 0 );
					break;
				case 13: 
					AddComponent( new WallBannerComponent( 0x1632 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1631 ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x162E ), 0, 2, 0 );
					break;
				case 14: 
					AddComponent( new WallBannerComponent( 0x1598 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x159B ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x159C ), 2, 0, 0 );
					break;
				case 15: 
					AddComponent( new WallBannerComponent( 0x1633 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1630 ), 0, 1, 0 );
					AddComponent( new WallBannerComponent( 0x162F ), 0, 2, 0 );
					break;
				case 16: 
					AddComponent( new WallBannerComponent( 0x1599 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x159A ), 1, 0, 0 );
					AddComponent( new WallBannerComponent( 0x159D ), 2, 0, 0 );
					break;


				case 17: 
					AddComponent( new WallBannerComponent( 0x1610 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x160F ), 0, 1, 0 );
					break;
				case 18: 
					AddComponent( new WallBannerComponent( 0x15A0 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15A1 ), 1, 0, 0 );
					break;

				case 19: 
					AddComponent( new WallBannerComponent( 0x1612 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1611 ), 0, 1, 0 );
					break;
				case 20: 
					AddComponent( new WallBannerComponent( 0x15A2 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15A3 ), 1, 0, 0 );
					break;

				case 21: 
					AddComponent( new WallBannerComponent( 0x1614 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1613 ), 0, 1, 0 );
					break;
				case 22: 
					AddComponent( new WallBannerComponent( 0x15A4 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15A5 ), 1, 0, 0 );
					break;

				case 23: 
					AddComponent( new WallBannerComponent( 0x1616 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1615 ), 0, 1, 0 );
					break;
				case 24: 
					AddComponent( new WallBannerComponent( 0x15A6 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15A7 ), 1, 0, 0 );
					break;

				case 25: 
					AddComponent( new WallBannerComponent( 0x1618 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1617 ), 0, 1, 0 );
					break;
				case 26: 
					AddComponent( new WallBannerComponent( 0x15A8 ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15A9 ), 1, 0, 0 );
					break;

				case 27: 
					AddComponent( new WallBannerComponent( 0x161A ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x1619 ), 0, 1, 0 );
					break;
				case 28: 
					AddComponent( new WallBannerComponent( 0x15AA ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15AB ), 1, 0, 0 );
					break;

				case 29: 
					AddComponent( new WallBannerComponent( 0x161C ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x161B ), 0, 1, 0 );
					break;
				case 30: 
					AddComponent( new WallBannerComponent( 0x15AC ), 0, 0, 0 );
					AddComponent( new WallBannerComponent( 0x15AD ), 1, 0, 0 );
					break;
			}
		}

		public WallBanner( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.WriteEncodedInt( 0 ); // version
			
			writer.Write( (bool) m_East );
			writer.Write( (bool) m_IsRewardItem );
		}
			
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadEncodedInt();
			
			m_East = reader.ReadBool();
			m_IsRewardItem = reader.ReadBool();
		}
	}	
	
	public class WallBannerDeed : BaseAddonDeed, IRewardItem
	{
		public override int LabelNumber{ get{ return 1080549; } } // Wall Banner Deed

		public override BaseAddon Addon
		{
			get
			{
				WallBanner addon = new WallBanner( m_BannerID );
				addon.IsRewardItem = m_IsRewardItem;

				return addon;
			}
		}

		private int m_BannerID;
		private bool m_IsRewardItem;

		[CommandProperty( AccessLevel.GameMaster )]
		public bool IsRewardItem
		{
			get{ return m_IsRewardItem; }
			set{ m_IsRewardItem = value; InvalidateProperties(); }
		}
		
		[Constructable]
		public WallBannerDeed() : base()
		{			
			LootType = LootType.Blessed;
		}

		public WallBannerDeed( Serial serial ) : base( serial )
		{
		}
		
		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );
			
			if ( m_IsRewardItem )
				list.Add( 1076225 ); // 9th Year Veteran Reward
		}
		
		public override void OnDoubleClick( Mobile from )
		{        	
			if ( m_IsRewardItem && !RewardSystem.CheckIsUsableBy( from, this, null ) )
				return;
		
			if ( IsChildOf( from.Backpack ) )
			{
				from.CloseGump( typeof( InternalGump ) );
				from.SendGump( new InternalGump( this ) );
			}
			else
				from.SendLocalizedMessage( 1042038 ); // You must have the object in your backpack to use it.          	
		}
		
		public void Use( Mobile m, int bannerID )
		{
			m_BannerID = bannerID;
		
			base.OnDoubleClick( m );
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.WriteEncodedInt( 0 ); // version
			
			writer.Write( (bool) m_IsRewardItem );
		}
			
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadEncodedInt();
			
			m_IsRewardItem = reader.ReadBool();
		}
		
		private class InternalGump : Gump
		{
			private WallBannerDeed m_WallBanner;
			
			public InternalGump( WallBannerDeed WallBanner ) : base( 150, 50 )
			{
				m_WallBanner = WallBanner;
				
				Closable = true;
				Disposable = true;
				Dragable = true;
				Resizable = false;
				
				AddBackground( 25, 0, 500, 265, 0xA28 );
				AddLabel( 70, 12, 0x3E3, "Choose a Wall Banner:" );

				AddPage( 1 );

				AddItem( 55, 110, 0x161D );
				AddItem( 75, 90, 0x161E );
				AddItem( 95, 70, 0x161F );
				AddButton( 70, 50, 0x845, 0x846, 1, GumpButtonType.Reply, 0 );
				AddItem( 105, 70, 0x1586 );
				AddItem( 125, 90, 0x1587 );
				AddItem( 145, 110, 0x1588 );
				AddButton( 145, 50, 0x845, 0x846, 2, GumpButtonType.Reply, 0 );
				AddItem( 200, 110, 0x1620 );
				AddItem( 220, 90, 0x1621 );
				AddItem( 240, 70, 0x1622 );
				AddButton( 220, 50, 0x845, 0x846, 3, GumpButtonType.Reply, 0 );
				AddItem( 250, 70, 0x1589 );
				AddItem( 270, 90, 0x158A );
				AddItem( 290, 110, 0x158B );
				AddButton( 300, 50, 0x845, 0x846, 4, GumpButtonType.Reply, 0 );
				AddItem( 350, 110, 0x1623 );
				AddItem( 370, 90, 0x1624 );
				AddItem( 390, 70, 0x1625 );
				AddButton( 365, 50, 0x845, 0x846, 5, GumpButtonType.Reply, 0 );
				AddItem( 400, 70, 0x158C );
				AddItem( 420, 90, 0x158D );
				AddItem( 440, 110, 0x158E );
				AddButton( 445, 50, 0x845, 0x846, 6, GumpButtonType.Reply, 0 );
				AddButton( 455, 205, 0x8B0, 0x8B0, 0, GumpButtonType.Page, 2 );

				AddPage( 2 );

				AddItem( 52, 110, 0x1626 );
				AddItem( 72, 90, 0x1627 );
				AddItem( 95, 70, 0x1628 );
				AddButton( 70, 50, 0x845, 0x846, 7, GumpButtonType.Reply, 0 );
				AddItem( 105, 70, 0x1590 );
				AddItem( 125, 90, 0x1591 );
				AddItem( 145, 110, 0x158F );
				AddButton( 145, 50, 0x845, 0x846, 8, GumpButtonType.Reply, 0 );
				AddItem( 197, 110, 0x1626 );
				AddItem( 217, 90, 0x1629 );
				AddItem( 240, 70, 0x162A );
				AddButton( 220, 50, 0x845, 0x846, 9, GumpButtonType.Reply, 0 );
				AddItem( 250, 70, 0x1592 );
				AddItem( 270, 90, 0x1593 );
				AddItem( 290, 110, 0x158F );
				AddButton( 300, 50, 0x845, 0x846, 10, GumpButtonType.Reply, 0 );
				AddItem( 340, 110, 0x162B );
				AddItem( 363, 90, 0x162C );
				AddItem( 385, 70, 0x162D );
				AddButton( 365, 50, 0x845, 0x846, 11, GumpButtonType.Reply, 0 );
				AddItem( 395, 70, 0x1594 );
				AddItem( 417, 90, 0x1595 );
				AddItem( 439, 111, 0x1596 );
				AddButton( 445, 50, 0x845, 0x846, 12, GumpButtonType.Reply, 0 );
				AddButton( 70, 205, 0x8AF, 0x8AF, 0, GumpButtonType.Page, 1 );
				AddButton( 455, 205, 0x8B0, 0x8B0, 0, GumpButtonType.Page, 3 );

				AddPage( 3 );

				AddItem( 55, 110, 0x162E );
				AddItem( 75, 93, 0x1631 );
				AddItem( 95, 70, 0x1632 );
				AddButton( 70, 50, 0x845, 0x846, 13, GumpButtonType.Reply, 0 );
				AddItem( 118, 70, 0x1598 );
				AddItem( 138, 94, 0x159B );
				AddItem( 159, 113, 0x159C );
				AddButton( 160, 50, 0x845, 0x846, 14, GumpButtonType.Reply, 0 );
				AddItem( 219, 111, 0x162F );
				AddItem( 238, 94, 0x1630 );
				AddItem( 258, 70, 0x1633 );
				AddButton( 240, 50, 0x845, 0x846, 15, GumpButtonType.Reply, 0 );
				AddItem( 279, 70, 0x1599 );
				AddItem( 298, 93, 0x159A );
				AddItem( 319, 113, 0x159D );
				AddButton( 320, 50, 0x845, 0x846, 16, GumpButtonType.Reply, 0 );
				AddItem( 380, 90, 0x160F );
				AddItem( 400, 70, 0x1610 );
				AddButton( 390, 50, 0x845, 0x846, 17, GumpButtonType.Reply, 0 );
				AddItem( 420, 70, 0x15A0 );
				AddItem( 440, 90, 0x15A1 );
				AddButton( 455, 50, 0x845, 0x846, 18, GumpButtonType.Reply, 0 );
				AddButton( 70, 205, 0x8AF, 0x8AF, 0, GumpButtonType.Page, 2 );
				AddButton( 455, 205, 0x8B0, 0x8B0, 0, GumpButtonType.Page, 4 );

				AddPage( 4 );

				AddItem( 55, 90, 0x1611 );
				AddItem( 75, 70, 0x1612 );
				AddButton( 70, 50, 0x845, 0x846, 19, GumpButtonType.Reply, 0 );
				AddItem( 105, 70, 0x15A2 );
				AddItem( 125, 90, 0x15A3 );
				AddButton( 145, 50, 0x845, 0x846, 20, GumpButtonType.Reply, 0 );
				AddItem( 200, 84, 0x1613 );
				AddItem( 220, 70, 0x1614 );
				AddButton( 215, 50, 0x845, 0x846, 21, GumpButtonType.Reply, 0 );
				AddItem( 250, 70, 0x15A4 );
				AddItem( 270, 84, 0x15A5 );
				AddButton( 290, 50, 0x845, 0x846, 22, GumpButtonType.Reply, 0 );
				AddItem( 350, 90, 0x1615 );
				AddItem( 370, 70, 0x1616 );
				AddButton( 365, 50, 0x845, 0x846, 23, GumpButtonType.Reply, 0 );
				AddItem( 400, 70, 0x15A6 );
				AddItem( 420, 90, 0x15A7 );
				AddButton( 445, 50, 0x845, 0x846, 24, GumpButtonType.Reply, 0 );
				AddButton( 70, 205, 0x8AF, 0x8AF, 0, GumpButtonType.Page, 3 );
				AddButton( 455, 205, 0x8B0, 0x8B0, 0, GumpButtonType.Page, 5 );

				AddPage( 5 );

				AddItem( 55, 90, 0x1617 );
				AddItem( 77, 70, 0x1618 );
				AddButton( 70, 50, 0x845, 0x846, 25, GumpButtonType.Reply, 0 );
				AddItem( 105, 70, 0x15A8 );
				AddItem( 127, 90, 0x15A9 );
				AddButton( 145, 50, 0x845, 0x846, 26, GumpButtonType.Reply, 0 );
				AddItem( 200, 90, 0x1619 );
				AddItem( 222, 70, 0x161A );
				AddButton( 220, 50, 0x845, 0x846, 27, GumpButtonType.Reply, 0 );
				AddItem( 250, 70, 0x15AA );
				AddItem( 272, 90, 0x15AB );
				AddButton( 300, 50, 0x845, 0x846, 28, GumpButtonType.Reply, 0 );
				AddItem( 350, 90, 0x161B );
				AddItem( 372, 70, 0x161C );
				AddButton( 365, 50, 0x845, 0x846, 29, GumpButtonType.Reply, 0 );
				AddItem( 400, 70, 0x15AC );
				AddItem( 422, 90, 0x15AD );
				AddButton( 445, 50, 0x845, 0x846, 30, GumpButtonType.Reply, 0 );
				AddButton( 70, 205, 0x8AF, 0x8AF, 0, GumpButtonType.Page, 4 );
			}

			public override void OnResponse( NetState sender, RelayInfo info )
			{
				if ( m_WallBanner == null || m_WallBanner.Deleted )
					return;

				if ( info.ButtonID > 0 && info.ButtonID < 31 )
					m_WallBanner.Use( sender.Mobile, info.ButtonID );
			}
		}
	}
}
