using System;
using System.Collections.Generic;
using Server.Gumps;
using Server.Multis;

namespace Server.Items
{
	public class EnhancedBandage : Bandage
	{
		public static int HealingBonus { get { return 10; } }

		public override int LabelNumber { get { return 1152441; } } // enhanced bandage

		[Constructable]
		public EnhancedBandage()
			: this( 1 )
		{
		}

		[Constructable]
		public EnhancedBandage( int amount )
			: base( amount )
		{
			Hue = 0x8A5;
		}

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

		public override bool Dye( Mobile from, DyeTub sender )
		{
			return false;
		}

		public override void AddNameProperties( ObjectPropertyList list )
		{
			base.AddNameProperties( list );

			list.Add( 1075216 ); // these bandages have been enhanced
		}

		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();
		}
	}

	[FlipableAttribute( 0x2AC0, 0x2AC3 )]
	public class FountainOfLife : BaseAddonContainer
	{
		public override BaseAddonContainerDeed Deed
		{
			get { return new FountainOfLifeDeed( m_Charges ); }
		}

		public override bool OnDragLift( Mobile from )
		{
			return false;
		}

		public virtual TimeSpan RechargeTime { get { return TimeSpan.FromDays( 1 ); } }

		public override int LabelNumber { get { return 1075197; } } // Fountain of Life
		public override int DefaultGumpID { get { return 0x484; } }
		public override int DefaultDropSound { get { return 66; } }
		public override int DefaultMaxItems { get { return 125; } }

		private int m_Charges;

		[CommandProperty( AccessLevel.GameMaster )]
		public int Charges
		{
			get { return m_Charges; }
			set { m_Charges = Math.Min( value, 10 ); InvalidateProperties(); }
		}

		private Timer m_Timer;

		[Constructable]
		public FountainOfLife()
			: this( 10 )
		{
		}

		[Constructable]
		public FountainOfLife( int charges )
			: base( 0x2AC0 )
		{
			m_Charges = charges;

			m_Timer = Timer.DelayCall( RechargeTime, RechargeTime, new TimerCallback( Recharge ) );
		}

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

		public override bool OnDragDrop( Mobile from, Item dropped )
		{
			if( dropped is Bandage )
			{
				bool allow = base.OnDragDrop( from, dropped );

				if( allow )
					Enhance( from );

				return allow;
			}
			else
			{
				from.SendLocalizedMessage( 1075209 ); // Only bandages may be dropped into the fountain.
				return false;
			}
		}

		public override bool OnDragDropInto( Mobile from, Item item, Point3D p )
		{
			if( item is Bandage )
			{
				bool allow = base.OnDragDropInto( from, item, p );

				if( allow )
					Enhance( from );

				return allow;
			}
			else
			{
				from.SendLocalizedMessage( 1075209 ); // Only bandages may be dropped into the fountain.
				return false;
			}
		}

		public override void AddNameProperties( ObjectPropertyList list )
		{
			base.AddNameProperties( list );

			list.Add( 1075217, m_Charges.ToString() ); // ~1_val~ charges remaining
		}

		public override void OnDelete()
		{
			if( m_Timer != null )
				m_Timer.Stop();

			base.OnDelete();
		}

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

			writer.WriteEncodedInt( 0 ); //version

			writer.Write( m_Charges );
			writer.Write( (DateTime)m_Timer.Next );
		}

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

			int version = reader.ReadEncodedInt();

			m_Charges = reader.ReadInt();

			DateTime next = reader.ReadDateTime();

			if( next < DateTime.Now )
				m_Timer = Timer.DelayCall( TimeSpan.Zero, RechargeTime, new TimerCallback( Recharge ) );
			else
				m_Timer = Timer.DelayCall( next - DateTime.Now, RechargeTime, new TimerCallback( Recharge ) );
		}

		public void Recharge()
		{
			m_Charges = 10;

			Enhance( null );
		}

		public void Enhance( Mobile from )
		{
			for( int i = Items.Count - 1; i >= 0 && m_Charges > 0; --i )
			{
				if ( Items[i] is EnhancedBandage )
					continue;

				Bandage bandage = Items[i] as Bandage;

				if( bandage != null )
				{
					Item enhanced;

					if( bandage.Amount > m_Charges )
					{
						bandage.Amount -= m_Charges;
						enhanced = new EnhancedBandage( m_Charges );
						m_Charges = 0;
					}
					else
					{
						enhanced = new EnhancedBandage( bandage.Amount );
						m_Charges -= bandage.Amount;
						bandage.Delete();
					}

					if ( from == null || !TryDropItem( from, enhanced, false ) ) // try stacking first
						DropItem( enhanced );
				}
			}

			InvalidateProperties();
		}
	}

	public class FountainOfLifeDeed : BaseAddonContainerDeed
	{
		public override int LabelNumber { get { return 1075197; } } // Fountain of Life
		public override BaseAddonContainer Addon { get { return new FountainOfLife( m_Charges ); } }

		private int m_Charges;

		[CommandProperty( AccessLevel.GameMaster )]
		public int Charges
		{
			get { return m_Charges; }
			set { m_Charges = Math.Min( value, 10 ); InvalidateProperties(); }
		}

		[Constructable]
		public FountainOfLifeDeed()
			: this( 10 )
		{
		}

		[Constructable]
		public FountainOfLifeDeed( int charges )
			: base()
		{
			LootType = LootType.Blessed;
			m_Charges = charges;
		}

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

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

			writer.WriteEncodedInt( 0 ); //version

			writer.Write( m_Charges );
		}

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

			int version = reader.ReadEncodedInt();

			m_Charges = reader.ReadInt();
		}
	}
}