namespace Server.Items
{
	public abstract class BaseWaterContainer : Container, IHasQuantity
	{
		public abstract int voidItem_ID { get; }
		public abstract int fullItem_ID { get; }
		public abstract int MaxQuantity { get; }

		public override int DefaultGumpID { get { return 0x3e; } }

		[CommandProperty( AccessLevel.GameMaster )]
		public virtual bool IsEmpty { get { return ( m_Quantity <= 0 ); } }

		[CommandProperty( AccessLevel.GameMaster )]
		public virtual bool IsFull { get { return ( m_Quantity >= MaxQuantity ); } }

		[CommandProperty( AccessLevel.GameMaster )]
		public virtual int Quantity
		{
			get
			{
				return m_Quantity;
			}
			set
			{
				if( value != m_Quantity )
				{
					m_Quantity = ( value < 1 ) ? 0 : ( value > MaxQuantity ) ? MaxQuantity : value;

					Movable = ( !IsLockedDown ) ? IsEmpty : false;

					ItemID = ( IsEmpty ) ? voidItem_ID : fullItem_ID;

					if( !IsEmpty )
					{
						IEntity rootParent = RootParent;

						if( rootParent != null && rootParent.Map != null && rootParent.Map != Map.Internal )
							MoveToWorld( rootParent.Location, rootParent.Map );
					}

					InvalidateProperties();
				}
			}
		}

		private int m_Quantity;

		public BaseWaterContainer( int Item_Id, bool filled )
			: base( Item_Id )
		{
			m_Quantity = ( filled ) ? MaxQuantity : 0;
		}

		public override void OnDoubleClick( Mobile from )
		{
			if( IsEmpty )
			{
				base.OnDoubleClick( from );
			}
		}

		public override void OnSingleClick( Mobile from )
		{
			if( IsEmpty )
			{
				base.OnSingleClick( from );
			}
			else
			{
				if( Name == null )
					LabelTo( from, LabelNumber );
				else
					LabelTo( from, Name );
			}
		}

		public override void OnAosSingleClick( Mobile from )
		{
			if( IsEmpty )
			{
				base.OnAosSingleClick( from );
			}
			else
			{
				if( Name == null )
					LabelTo( from, LabelNumber );
				else
					LabelTo( from, Name );
			}
		}

		public override void GetProperties( ObjectPropertyList list )
		{
			if( IsEmpty )
			{
				base.GetProperties( list );
			}
		}

		public override bool OnDragDropInto( Mobile from, Item item, Point3D p )
		{
			if( !IsEmpty )
			{
				return false;
			}

			return base.OnDragDropInto( from, item, p );
		}

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

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

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

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

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