using System;
using System.Collections;
using Server;
using Server.Items;
using Server.Gumps;
using Server.Mobiles;
using Server.Targeting;
using Server.Engines.CannedEvil;

namespace Server
{
	public class ValorVirtue
	{
		private static TimeSpan LossDelay = TimeSpan.FromDays( 7.0 );
		private const int LossAmount = 250;

		public static void Initialize()
		{
			VirtueGump.Register( 112, new OnVirtueUsed( OnVirtueUsed ) );
		}

		public static void OnVirtueUsed( Mobile from )
		{
			if( from.Alive )
			{
				from.SendLocalizedMessage( 1054034 ); // Target the Champion Idol of the Champion you wish to challenge!.
				from.Target = new InternalTarget();
			}
		}

		public static void CheckAtrophy( Mobile from )
		{
			PlayerMobile pm = from as PlayerMobile;

			if( pm == null )
				return;

			try
			{
				if( (pm.LastValorLoss + LossDelay) < DateTime.UtcNow )
				{
					if( VirtueHelper.Atrophy( from, VirtueName.Valor, LossAmount ) )
						from.SendLocalizedMessage( 1054040 ); // You have lost some Valor.

					pm.LastValorLoss = DateTime.UtcNow;
				}
			}
			catch
			{
			}
		}

		public static void Valor( Mobile from, object targ )
		{
			IdolOfTheChampion idol = targ as IdolOfTheChampion;

			if( idol == null || idol.Deleted || idol.Spawn == null || idol.Spawn.Deleted )
				from.SendLocalizedMessage( 1054035 ); // You must target a Champion Idol to challenge the Champion's spawn!
			else if( from.Hidden )
				from.SendLocalizedMessage( 1052015 ); // You cannot do that while hidden.
			else if( idol.Spawn.HasBeenAdvanced )
				from.SendLocalizedMessage( 1054038 ); // The Champion of this region has already been challenged!
			else
			{
				VirtueLevel vl = VirtueHelper.GetLevel( from, VirtueName.Valor );
				if( idol.Spawn.Active )
				{
					if( idol.Spawn.Champion != null )	//TODO: Message?
						return;

					int needed, consumed;
					switch( idol.Spawn.GetSubLevel() )
					{
						case 0:
						{
							needed = consumed = 2500;
							break;
						}
						case 1:
						{
							needed = consumed = 5000;
							break;
						}
						case 2:
						{
							needed = 10000;
							consumed = 7500;
							break;
						}
						default:
						{
							needed = 20000;
							consumed = 10000;
							break;
						}
					}

					if( from.Virtues.GetValue( (int)VirtueName.Valor ) >= needed )
					{
						VirtueHelper.Atrophy( from, VirtueName.Valor, consumed );
						from.SendLocalizedMessage( 1054037 ); // Your challenge is heard by the Champion of this region! Beware its wrath!
						idol.Spawn.HasBeenAdvanced = true;
						idol.Spawn.AdvanceLevel();
					}
					else
						from.SendLocalizedMessage( 1054039 ); // The Champion of this region ignores your challenge. You must further prove your valor.
				}
				else
				{
					if( vl == VirtueLevel.Knight )
					{
						VirtueHelper.Atrophy( from, VirtueName.Valor, 11000 );
						from.SendLocalizedMessage( 1054037 ); // Your challenge is heard by the Champion of this region! Beware its wrath!
						idol.Spawn.EndRestart();
						idol.Spawn.HasBeenAdvanced = true;
					}
					else
					{
						from.SendLocalizedMessage( 1054036 ); // You must be a Knight of Valor to summon the champion's spawn in this manner!
					}
				}
			}

		}

		private class InternalTarget : Target
		{
			public InternalTarget()	: base( 14, false, TargetFlags.None )
			{
			}

			protected override void OnTarget( Mobile from, object targeted )
			{
				Valor( from, targeted );
			}
		}
	}
}