using System;
using Server.Items;
using Server.Targeting;
using Server.Mobiles;

namespace Server.Spells.Spellweaving
{
	public class DryadAllureSpell : ArcanistSpell
	{	
		private static SpellInfo m_Info = new SpellInfo(
                "Dryad Allure", "Rathril",
				-1
			);
			
		public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 3 ); } }

        public override double RequiredSkill { get { return 52.0; } }
        public override int RequiredMana { get { return 40; } }

        public DryadAllureSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info )
		{
		}

		public override void OnCast()
		{
			Caster.Target = new InternalTarget( this );
		}

		public void Target( BaseCreature bc )
		{
			if ( !Caster.CanSee( bc.Location ) || !Caster.InLOS( bc ) )
			{
				Caster.SendLocalizedMessage( 500237 ); // Target can not be seen.
			}
			else if ( !IsValidTarget( bc ) )
			{
				Caster.SendLocalizedMessage( 1074379 ); // You cannot charm that!
			}
			else if ( Caster.Followers + 3 > Caster.FollowersMax )
			{
				Caster.SendLocalizedMessage( 1049607 ); // You have too many followers to control that creature.
			}
			else if ( bc.Allured )
			{
				Caster.SendLocalizedMessage( 1074380 ); // This humanoid is already controlled by someone else.				
			}			
			else if ( CheckSequence() )
			{
				int level = GetFocusLevel( Caster );
				double skill = Caster.Skills[ CastSkill ].Value;

				double chance = ( skill / 150.0 ) + ( level / 50.0 );

				if ( chance > Utility.RandomDouble() )
				{
					bc.ControlSlots = 3;				
					bc.Combatant = null;
						
					if ( Caster.Combatant == bc )
					{
						Caster.Combatant = null;
						Caster.Warmode = false;
					}
					
					if ( bc.SetControlMaster( Caster ) )
					{
						bc.PlaySound( 0x5C4 );
						bc.Allured = true;
						
						Container pack = bc.Backpack;

						if ( pack != null )
						{
							for ( int i = pack.Items.Count - 1; i >= 0; --i )
							{
								if ( i >= pack.Items.Count )
									continue;
			
								pack.Items[i].Delete();
							}
						}
						
						Caster.SendLocalizedMessage( 1074377 ); // You allure the humanoid to follow and protect you.
					}
				}
				else
				{
					bc.PlaySound( 0x5C5 );
					bc.ControlTarget = Caster;
					bc.ControlOrder = OrderType.Attack;
					bc.Combatant = Caster;

					Caster.SendLocalizedMessage( 1074378 ); // The humanoid becomes enraged by your charming attempt and attacks you.
				}
			}

			FinishSequence();
		}
		
		public static bool IsValidTarget( BaseCreature bc )
		{
			if ( bc == null || bc.IsParagon || ( bc.Controlled && !bc.Allured ) || bc.Summoned )
				return false;
				
			SlayerEntry slayer = SlayerGroup.GetEntryByName( SlayerName.Repond );
			
			if ( slayer != null && slayer.Slays( bc ) )
				return true;
			
			return false;
		}

		public class InternalTarget : Target
		{
			private DryadAllureSpell m_Owner;

			public InternalTarget( DryadAllureSpell owner ) : base( 12, false, TargetFlags.None )
			{
				m_Owner = owner;
			}

			protected override void OnTarget( Mobile m, object o )
			{
				if ( o is BaseCreature )
				{
					m_Owner.Target( (BaseCreature) o );
				}
				else
				{
					m.SendLocalizedMessage( 1074379 ); // You cannot charm that!
				}
			}

			protected override void OnTargetFinish( Mobile m )
			{
				m_Owner.FinishSequence();
			}
		}
	}
}