using System;
using Server;
using Server.Network;

namespace Server.Items
{
	public class RejuvinationAddonComponent : AddonComponent
	{
		public RejuvinationAddonComponent( int itemID ) : base( itemID )
		{
		}

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

		public override void OnDoubleClick( Mobile from )
		{
			if ( from.BeginAction( typeof( RejuvinationAddonComponent ) ) )
			{
				from.FixedEffect( 0x373A, 1, 16 );

				int random = Utility.Random( 1, 4 );

				if ( random == 1 || random == 4 )
				{
					from.Hits = from.HitsMax;
					SendLocalizedMessageTo( from, 500801 ); // A sense of warmth fills your body!
				}

				if ( random == 2 || random == 4 )
				{
					from.Mana = from.ManaMax;
					SendLocalizedMessageTo( from, 500802 ); // A feeling of power surges through your veins!
				}

				if ( random == 3 || random == 4 )
				{
					from.Stam = from.StamMax;
					SendLocalizedMessageTo( from, 500803 ); // You feel as though you've slept for days!
				}

				Timer.DelayCall( TimeSpan.FromHours( 2.0 ), new TimerStateCallback( ReleaseUseLock_Callback ), new object[]{ from, random } );
			}
		}

		public virtual void ReleaseUseLock_Callback( object state )
		{
			object[] states = (object[])state;

			Mobile from = (Mobile)states[0];
			int random = (int)states[1];

			from.EndAction( typeof( RejuvinationAddonComponent ) );

			if ( random == 4 )
			{
				from.Hits = from.HitsMax;
				from.Mana = from.ManaMax;
				from.Stam = from.StamMax;
				SendLocalizedMessageTo( from, 500807 ); // You feel completely rejuvinated!
			}
		}

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

			writer.Write( (int) 0 );
		}

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

			int version = reader.ReadInt();
		}
	}

	public abstract class BaseRejuvinationAnkh : BaseAddon
	{
		public BaseRejuvinationAnkh()
		{
		}

		public override bool HandlesOnMovement{ get{ return true; } }

		private DateTime m_NextMessage;

		public override void OnMovement( Mobile m, Point3D oldLocation )
		{
			base.OnMovement( m, oldLocation );

			if ( m.Player && Utility.InRange( Location, m.Location, 3 ) && !Utility.InRange( Location, oldLocation, 3 ) )
			{
				if ( DateTime.UtcNow >= m_NextMessage )
				{
					if ( Components.Count > 0 )
						((AddonComponent)Components[0]).SendLocalizedMessageTo( m, 1010061 ); // An overwhelming sense of peace fills you.

					m_NextMessage = DateTime.UtcNow + TimeSpan.FromSeconds( 25.0 );
				}
			}
		}

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

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

			writer.Write( (int) 0 );
		}

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

			int version = reader.ReadInt();
		}
	}

	public class RejuvinationAnkhWest : BaseRejuvinationAnkh
	{
		[Constructable]
		public RejuvinationAnkhWest()
		{
			AddComponent( new RejuvinationAddonComponent( 0x3 ), 0, 0, 0 );
			AddComponent( new RejuvinationAddonComponent( 0x2 ), 0, 1, 0 );
		}

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

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

			writer.Write( (int) 0 );
		}

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

			int version = reader.ReadInt();
		}
	}

	public class RejuvinationAnkhNorth : BaseRejuvinationAnkh
	{
		[Constructable]
		public RejuvinationAnkhNorth()
		{
			AddComponent( new RejuvinationAddonComponent( 0x4 ), 0, 0, 0 );
			AddComponent( new RejuvinationAddonComponent( 0x5 ), 1, 0, 0 );
		}

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

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

			writer.Write( (int) 0 );
		}

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

			int version = reader.ReadInt();
		}
	}
}