using System;
using Server;
using Server.Items;
using Server.Gumps;
using Server.Multis;
using Server.Network;
using Server.Targeting;

namespace Server.Items
{
	public class HolidayTreeDeed : Item
	{
		public override int LabelNumber{ get{ return 1041116; } } // a deed for a holiday tree

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

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

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

			writer.Write( (int) 0 ); // version
		}

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

			int version = reader.ReadInt();

			LootType = LootType.Blessed;
		}

		public bool ValidatePlacement( Mobile from, Point3D loc )
		{
			if ( from.AccessLevel >= AccessLevel.GameMaster )
				return true;

			if ( !from.InRange( this.GetWorldLocation(), 1 ) )
			{
				from.SendLocalizedMessage( 500446 ); // That is too far away.
				return false;
			}

			if ( DateTime.UtcNow.Month != 12 )
			{
				from.SendLocalizedMessage( 1005700 ); // You will have to wait till next December to put your tree back up for display.
				return false;
			}

			Map map = from.Map;

			if ( map == null )
				return false;

			BaseHouse house = BaseHouse.FindHouseAt( loc, map, 20 );

			if ( house == null || !house.IsFriend( from ) )
			{
				from.SendLocalizedMessage( 1005701 ); // The holiday tree can only be placed in your house.
				return false;
			}

			if ( !map.CanFit( loc, 20 ) )
			{
				from.SendLocalizedMessage( 500269 ); // You cannot build that there.
				return false;
			}

			return true;
		}

		public void BeginPlace( Mobile from, HolidayTreeType type )
		{
			from.BeginTarget( -1, true, TargetFlags.None, new TargetStateCallback( Placement_OnTarget ), type );
		}

		public void Placement_OnTarget( Mobile from, object targeted, object state )
		{
			IPoint3D p = targeted as IPoint3D;

			if ( p == null )
				return;

			Point3D loc = new Point3D( p );

			if ( p is StaticTarget )
				loc.Z -= TileData.ItemTable[((StaticTarget)p).ItemID].CalcHeight;	/* NOTE: OSI does not properly normalize Z positioning here.
													* A side affect is that you can only place on floors (due to the CanFit call).
													* That functionality may be desired. And so, it's included in this script.
													*/

			if ( ValidatePlacement( from, loc ) )
				EndPlace( from, (HolidayTreeType) state, loc );
		}

		public void EndPlace( Mobile from, HolidayTreeType type, Point3D loc )
		{
			this.Delete();
			HolidayTree tree = new HolidayTree( from, type, loc );
			BaseHouse house = BaseHouse.FindHouseAt( tree );
			if ( house != null ) 
				house.Addons.Add( tree );
		}

		public override void OnDoubleClick( Mobile from )
		{
			from.CloseGump( typeof( HolidayTreeChoiceGump ) );
			from.SendGump( new HolidayTreeChoiceGump( from, this ) );
		}
	}

	public class HolidayTreeChoiceGump : Gump
	{
		private Mobile m_From;
		private HolidayTreeDeed m_Deed;

		public HolidayTreeChoiceGump( Mobile from, HolidayTreeDeed deed ) : base( 200, 200 )
		{
			m_From = from;
			m_Deed = deed;

			AddPage( 0 );

			AddBackground( 0, 0, 220, 120, 5054 );
			AddBackground( 10, 10, 200, 100, 3000 );

			AddButton( 20, 35, 4005, 4007, 1, GumpButtonType.Reply, 0 );
			AddHtmlLocalized( 55, 35, 145, 25, 1018322, false, false ); // Classic

			AddButton( 20, 65, 4005, 4007, 2, GumpButtonType.Reply, 0 );
			AddHtmlLocalized( 55, 65, 145, 25, 1018321, false, false ); // Modern
		}

		public override void OnResponse( NetState sender, RelayInfo info )
		{
			if ( m_Deed.Deleted )
				return;

			switch ( info.ButtonID )
			{
				case 1:
				{
					m_Deed.BeginPlace( m_From, HolidayTreeType.Classic );
					break;
				}
				case 2:
				{
					m_Deed.BeginPlace( m_From, HolidayTreeType.Modern );
					break;
				}
			}
		}
	}
}