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

namespace Server.Items
{	
	public class RewardBrazier : Item, IRewardItem
	{
		public override bool ForceShowProperties{ get{ return ObjectPropertyList.Enabled; } }

		private bool m_IsRewardItem;

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

		private Item m_Fire;

		public override void OnDelete()
		{
			TurnOff();

			base.OnDelete();
		}

		private static int[] m_Art = new int[]
		{
			0x19AA, 0x19BB
		};
		
		[Constructable]
		public RewardBrazier() : this( Utility.RandomList( m_Art ) )
		{	
		}

		[Constructable]
		public RewardBrazier( int itemID ) : base( itemID )
		{
			LootType = LootType.Blessed;
			Weight = 10.0;
		}

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

		public void TurnOff()
		{
			if ( m_Fire != null )
			{
				m_Fire.Delete();
				m_Fire = null;
			}
		}

		public void TurnOn()
		{
			if ( m_Fire == null )
				m_Fire = new Item();
 
			m_Fire.ItemID = 0x19AB;
			m_Fire.Movable = false;
			m_Fire.MoveToWorld( new Point3D( X, Y, Z + ItemData.Height + 2 ), Map );
		}

		public override void OnDoubleClick( Mobile from )
		{
			if ( !from.InRange( this.GetWorldLocation(), 2 ) )
			{
				from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
			}
			else if ( IsLockedDown )
			{
				BaseHouse house = BaseHouse.FindHouseAt( from );

				if ( house != null && house.IsCoOwner( from ) )
				{
					if ( m_Fire != null )
						TurnOff();
					else
						TurnOn();
				}
				else
					from.SendLocalizedMessage( 502436 ); // That is not accessible.
			}
			else
				from.SendLocalizedMessage( 502692 ); // This must be in a house and be locked down to work.
		}

		public override void OnLocationChange( Point3D old )
		{
			if ( m_Fire != null )
				m_Fire.MoveToWorld( new Point3D( X, Y, Z + ItemData.Height ), Map );
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );
			
			if ( m_IsRewardItem )
				list.Add( 1076222 ); // 6th Year Veteran Reward
		}

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

			writer.WriteEncodedInt( 0 ); // version
			
			writer.Write( (bool) m_IsRewardItem );
			writer.Write( (Item) m_Fire );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadEncodedInt();
			
			m_IsRewardItem = reader.ReadBool();
			m_Fire = reader.ReadItem();
		}
	}	
	
	public class RewardBrazierDeed : Item, IRewardItem
	{
		public override int LabelNumber{ get{ return 1080527; } } // Brazier Deed

		private bool m_IsRewardItem;

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

		[Constructable]
		public RewardBrazierDeed() : base( 0x14F0 )
		{
			LootType = LootType.Blessed;
			Weight = 1.0;
		}

		public RewardBrazierDeed( Serial serial ) : base( serial )
		{
		}
		
		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 override void GetProperties( ObjectPropertyList list )
		{
			base.GetProperties( list );

			if ( m_IsRewardItem )
				list.Add( 1076222 ); // 6th Year Veteran Reward
		}

		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 RewardBrazierDeed m_Brazier;

			public InternalGump( RewardBrazierDeed brazier ) : base( 100, 200 )
			{
				m_Brazier = brazier;

				Closable = true;
				Disposable = true;
				Dragable = true;
				Resizable = false;

				AddPage( 0 );
				AddBackground( 0, 0, 200, 200, 2600 );

				AddPage( 1 );
				AddLabel( 45, 15, 0, "Choose a Brazier:" );

				AddItem( 40, 75, 0x19AA );
				AddButton( 55, 50, 0x845, 0x846, 0x19AA, GumpButtonType.Reply, 0 );

				AddItem( 100, 75, 0x19BB );
				AddButton( 115, 50, 0x845, 0x846, 0x19BB, GumpButtonType.Reply, 0 );
			}

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

				Mobile m = sender.Mobile;

				if ( info.ButtonID == 0x19AA || info.ButtonID == 0x19BB )
				{
					RewardBrazier brazier = new RewardBrazier( info.ButtonID );
					brazier.IsRewardItem = m_Brazier.IsRewardItem;

					if ( !m.PlaceInBackpack( brazier ) )
					{
						brazier.Delete();
						m.SendLocalizedMessage( 1078837 ); // Your backpack is full! Please make room and try again.
					}
					else
						m_Brazier.Delete();
				}
			}
		}
	}
}
