using System;
using Server;
using System.Reflection;
using Server.Targeting;

namespace Server.Items
{
	public class FlipCommandHandlers
	{
		public static void Initialize()
		{
			Server.Commands.CommandSystem.Register( "Flip", AccessLevel.GameMaster, new Server.Commands.CommandEventHandler( Flip_OnCommand ) );
		}

		[Usage( "Flip" )]
		[Description( "Turns an item." )]
		public static void Flip_OnCommand( Server.Commands.CommandEventArgs e )
		{
			e.Mobile.Target = new FlipTarget();
		}

		private class FlipTarget : Target
		{
			public FlipTarget() : base( -1, false, TargetFlags.None )
			{
			}

			protected override void OnTarget( Mobile from, object targeted )
			{
				if ( targeted is Item )
				{
					Item item = (Item)targeted;

					if ( item.Movable == false && from.AccessLevel == AccessLevel.Player )
						return;

					Type type = targeted.GetType();    

					FlipableAttribute [] AttributeArray = (FlipableAttribute []) type.GetCustomAttributes(typeof(FlipableAttribute), false);
            
					if( AttributeArray.Length == 0 )
					{
						return ;
					}

					FlipableAttribute fa = AttributeArray[0];

					fa.Flip( (Item)targeted);
				}
			}
		}
	}

	[AttributeUsage( AttributeTargets.Class )]
	public class DynamicFlipingAttribute : Attribute
	{
		public DynamicFlipingAttribute()
		{
		}
	}

	[AttributeUsage( AttributeTargets.Class )]
	public class FlipableAttribute : Attribute
	{
		private int[] m_ItemIDs;

		public int[] ItemIDs
		{
			get{ return m_ItemIDs; }
		}

		public FlipableAttribute() : this ( null )
		{
		}
		
		public FlipableAttribute( params int[] itemIDs )
		{
			m_ItemIDs = itemIDs;
		}

		public virtual void Flip( Item item )
		{
			if ( m_ItemIDs == null )
			{
				try
				{
					MethodInfo flipMethod = item.GetType().GetMethod( "Flip", Type.EmptyTypes );
					if ( flipMethod != null )
						flipMethod.Invoke( item, new object[0] );
				}
				catch
				{
				}

			}
			else
			{
				int index = 0;
				for ( int i = 0; i < m_ItemIDs.Length; i++ )
				{
					if ( item.ItemID == m_ItemIDs[i] )
					{
						index = i + 1;
						break;
					}
				}

				if ( index > m_ItemIDs.Length - 1)
					index = 0;
				
				item.ItemID = m_ItemIDs[index];
			}
		}
	}
}
