using System;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Network;

namespace Server.Gumps
{
	public class CharacterStatueGump : Gump
	{
		private Item m_Maker;
		private CharacterStatue m_Statue;
		private Timer m_Timer;
		private Mobile m_Owner;
	
		private enum Buttons
		{
			Close,
			Sculpt,			
			PosePrev,
			PoseNext,
			DirPrev,
			DirNext,
			MatPrev,
			MatNext,
			Restore
		}
	
		public CharacterStatueGump( Item maker, CharacterStatue statue, Mobile owner ) : base( 60, 36 )
		{
			m_Maker = maker;
			m_Statue = statue;
			m_Owner = owner;
			
			if ( m_Statue == null )
				return;
			
			Closable = true;
			Disposable = true;
			Dragable = true;
			Resizable = false;
		
			AddPage( 0 );
			
			AddBackground( 0, 0, 327, 324, 0x13BE );
			AddImageTiled( 10, 10, 307, 20, 0xA40 );
			AddImageTiled( 10, 40, 307, 244, 0xA40 );
			AddImageTiled( 10, 294, 307, 20, 0xA40 );
			AddAlphaRegion( 10, 10, 307, 304 );				
			AddHtmlLocalized( 14, 12, 327, 20, 1076156, 0x7FFF, false, false ); // Character Statue Maker
			
			// pose
			AddHtmlLocalized( 133, 41, 120, 20, 1076168, 0x7FFF, false, false ); // Choose Pose
			AddHtmlLocalized( 133, 61, 120, 20, 1076208 + (int) m_Statue.Pose, 0x77E, false, false );				
			AddButton( 163, 81, 0xFA5, 0xFA7, (int) Buttons.PoseNext, GumpButtonType.Reply, 0 );
			AddButton( 133, 81, 0xFAE, 0xFB0, (int) Buttons.PosePrev, GumpButtonType.Reply, 0 );
			
			// direction
			AddHtmlLocalized( 133, 126, 120, 20, 1076170, 0x7FFF, false, false ); // Choose Direction
			AddHtmlLocalized( 133, 146, 120, 20, GetDirectionNumber( m_Statue.Direction ), 0x77E, false, false );				
			AddButton( 163, 167, 0xFA5, 0xFA7, (int) Buttons.DirNext, GumpButtonType.Reply, 0 );
			AddButton( 133, 167, 0xFAE, 0xFB0, (int) Buttons.DirPrev, GumpButtonType.Reply, 0 );
			
			// material
			AddHtmlLocalized( 133, 211, 120, 20, 1076171, 0x7FFF, false, false ); // Choose Material
			AddHtmlLocalized( 133, 231, 120, 20, GetMaterialNumber( m_Statue.StatueType, m_Statue.Material ), 0x77E, false, false );				
			AddButton( 163, 253, 0xFA5, 0xFA7, (int) Buttons.MatNext, GumpButtonType.Reply, 0 );
			AddButton( 133, 253, 0xFAE, 0xFB0, (int) Buttons.MatPrev, GumpButtonType.Reply, 0 );
			
			// cancel			
			AddButton( 10, 294, 0xFB1, 0xFB2, (int) Buttons.Close, GumpButtonType.Reply, 0 );
			AddHtmlLocalized( 45, 294, 80, 20, 1006045, 0x7FFF, false, false );	// Cancel
			
			// sculpt			
			AddButton( 234, 294, 0xFB7, 0xFB9, (int) Buttons.Sculpt, GumpButtonType.Reply, 0 );
			AddHtmlLocalized( 269, 294, 80, 20, 1076174, 0x7FFF, false, false ); // Sculpt	
			
			// restore			
			if ( m_Maker is CharacterStatueDeed )
			{
				AddButton( 107, 294, 0xFAB, 0xFAD, (int) Buttons.Restore, GumpButtonType.Reply, 0 );
				AddHtmlLocalized( 142, 294, 80, 20, 1076193, 0x7FFF, false, false ); // Restore	
			}

			m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 2.5 ), TimeSpan.FromSeconds( 2.5 ), new TimerCallback( CheckOnline ) );
		}

		private void CheckOnline()
		{
			if ( m_Owner != null && m_Owner.NetState == null )
			{
				if ( m_Timer != null )
					m_Timer.Stop();

				if ( m_Statue != null && !m_Statue.Deleted )
					m_Statue.Delete();
			}
		}
		
		private int GetMaterialNumber( StatueType type, StatueMaterial material )
		{
			switch ( material )
			{
				case StatueMaterial.Antique:
					
					switch ( type )
					{
						case StatueType.Bronze: return 1076187;
						case StatueType.Jade: return 1076186;
						case StatueType.Marble: return 1076182;
					}

					return 1076187;
				case StatueMaterial.Dark: 
					
					if ( type == StatueType.Marble )
						return 1076183;

					return 1076182;
				case StatueMaterial.Medium: return 1076184;
				case StatueMaterial.Light: return 1076185;	
				default: return 1076187;
			}
		}
		
		private int GetDirectionNumber( Direction direction )
		{
			switch ( direction )
			{
				case Direction.North: return 1075389;
				case Direction.Right: return 1075388;
				case Direction.East: return 1075387;
				case Direction.Down: return 1076204;	
				case Direction.South: return 1075386;
				case Direction.Left: return 1075391;
				case Direction.West: return 1075390;
				case Direction.Up: return 1076205;
				default: return 1075386;
			}
		}
		
		public override void OnResponse( NetState state, RelayInfo info )
		{
            if (m_Statue == null || m_Statue.Deleted || m_Maker == null || m_Maker.Deleted || !m_Maker.IsChildOf(state.Mobile.Backpack))
                return;
				
			bool sendGump = false;
				
			if ( info.ButtonID == (int) Buttons.Sculpt )
			{					
				if ( m_Maker is CharacterStatueDeed )
				{
					CharacterStatue backup = ( (CharacterStatueDeed) m_Maker ).Statue;
					
					if ( backup != null )
						backup.Delete();
				}
					
				if ( m_Maker != null )
					m_Maker.Delete();
					
				m_Statue.Sculpt( state.Mobile );
			}
			else if ( info.ButtonID == (int) Buttons.PosePrev )
			{
				m_Statue.Pose = (StatuePose) ( ( (int) m_Statue.Pose + 5 ) % 6 );
				sendGump = true;
			}
			else if ( info.ButtonID == (int) Buttons.PoseNext )
			{
				m_Statue.Pose = (StatuePose) ( ( (int) m_Statue.Pose + 1 ) % 6 );
				sendGump = true;
			}
			else if ( info.ButtonID == (int) Buttons.DirPrev )
			{
				m_Statue.Direction = (Direction) ( ( (int) m_Statue.Direction + 7 ) % 8 );
				m_Statue.InvalidatePose();
				sendGump = true;
			}
			else if ( info.ButtonID == (int) Buttons.DirNext )
			{
				m_Statue.Direction = (Direction) ( ( (int) m_Statue.Direction + 1 ) % 8 );
				m_Statue.InvalidatePose();
				sendGump = true;
			}
			else if ( info.ButtonID == (int) Buttons.MatPrev )
			{
				m_Statue.Material = (StatueMaterial) ( ( (int) m_Statue.Material + 3 ) % 4 );
				sendGump = true;
			}
			else if ( info.ButtonID == (int) Buttons.MatNext )
			{
				m_Statue.Material = (StatueMaterial) ( ( (int) m_Statue.Material + 1 ) % 4 );
				sendGump = true;
			}
			else if ( info.ButtonID == (int) Buttons.Restore )
			{
				if ( m_Maker is CharacterStatueDeed )
				{
					CharacterStatue backup = ( (CharacterStatueDeed) m_Maker ).Statue;
					
					if ( backup != null )
						m_Statue.Restore( backup );
				}
				
				sendGump = true;
			}
			else
			{
				m_Statue.Delete();
			}

			if ( sendGump )
				state.Mobile.SendGump( new CharacterStatueGump( m_Maker, m_Statue, m_Owner ) );
			
			if ( m_Timer != null )
				m_Timer.Stop();
		}

		public override void OnServerClose( NetState owner )
		{
			if ( m_Timer != null )
				m_Timer.Stop();

			if ( m_Statue != null && !m_Statue.Deleted )
				m_Statue.Delete();
		}
	}
}
