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

namespace Server.Items
{
	public abstract class BaseGameBoard : Container, ISecurable
	{
		private SecureLevel m_Level;

		[CommandProperty( AccessLevel.GameMaster )]
		public SecureLevel Level
		{
			get{ return m_Level; }
			set{ m_Level = value; }
		}

		public BaseGameBoard( int itemID ) : base( itemID )
		{
			CreatePieces();

			Weight = 5.0;
		}

		public abstract void CreatePieces();

		public void Reset()
		{
			for ( int i = Items.Count - 1; i >= 0; --i )
			{
				if ( i < Items.Count )
					Items[i].Delete();
			}

			CreatePieces();
		}

		public void CreatePiece( BasePiece piece, int x, int y )
		{
			AddItem( piece );
			piece.Location = new Point3D( x, y, 0 );
		}

		public override bool DisplaysContent{ get{ return false; } } // Do not display (x items, y stones)

		public override bool IsDecoContainer{ get{ return false; } }

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

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( 1 ); // version

			writer.Write( (int)m_Level );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();

			if ( version == 1 )
				m_Level = (SecureLevel)reader.ReadInt();

			if ( Weight == 1.0 )
				Weight = 5.0;
		}

		public override TimeSpan DecayTime{ get{ return TimeSpan.FromDays( 1.0 ); } }

		public override bool OnDragDrop( Mobile from, Item dropped )
		{
			BasePiece piece = dropped as BasePiece;

			return ( piece != null && piece.Board == this && base.OnDragDrop( from, dropped ) );
		}

		public override bool OnDragDropInto( Mobile from, Item dropped, Point3D point )
		{
			BasePiece piece = dropped as BasePiece;

			if ( piece != null && piece.Board == this && base.OnDragDropInto( from, dropped, point ) )
			{
				Packet p = new PlaySound( 0x127, GetWorldLocation() );

				p.Acquire();

				if ( RootParent == from )
				{
					from.Send( p );
				}
				else
				{
					foreach ( NetState state in GetClientsInRange( 2 ) )
						state.Send( p );
				}

				p.Release();

				return true;
			}
			else
			{
				return false;
			}
		}

		public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
		{
			base.GetContextMenuEntries( from, list );

			if ( ValidateDefault( from, this ) )
				list.Add( new DefaultEntry( from, this ) );

			SetSecureLevelEntry.AddTo( from, this, list );
		}

        public static bool ValidateDefault(Mobile from, BaseGameBoard board)
		{
			if ( from.AccessLevel >= AccessLevel.GameMaster )
				return true;

			if ( !from.Alive )
				return false;

			if ( board.IsChildOf( from.Backpack ) )
				return true;

			object root = board.RootParent;

			if ( root is Mobile && root != from )
				return false;

			if ( board.Deleted || board.Map != from.Map || !from.InRange( board.GetWorldLocation(), 1 ) )
				return false;

			BaseHouse house = BaseHouse.FindHouseAt( board );

			return ( house != null && house.IsOwner( from ) );
		}

		public class DefaultEntry : ContextMenuEntry
		{
			private readonly Mobile m_From;
            private readonly BaseGameBoard m_Board;

            public DefaultEntry(Mobile from, BaseGameBoard board)
                : base(6162, from.AccessLevel >= AccessLevel.GameMaster ? -1 : 1)
			{
				m_From = from;
				m_Board = board;
			}

			public override void OnClick()
			{
                if (BaseGameBoard.ValidateDefault(m_From, m_Board))
					m_Board.Reset();
			}
		}
	}
}