using System;
using Server;
using Server.Gumps;
using Server.Items;
using Server.Mobiles;
using Server.Engines.Quests;
using Server.Engines.Quests.Necro;

namespace Server.Engines.Quests.Necro
{
	public class Mardoth : BaseQuester
	{
		[Constructable]
		public Mardoth() : base( "the Ancient Necromancer" )
		{
		}

		public override void InitBody()
		{
			InitStats( 100, 100, 25 );

			Hue = 0x8849;
			Body = 0x190;

			Name = "Mardoth";
		}

		public override bool OnDragDrop( Mobile from, Item dropped )
		{
			PlayerMobile player = from as PlayerMobile;

			if ( player != null )
			{
				QuestSystem qs = player.Quest;

				if ( qs is DarkTidesQuest )
				{
					if ( dropped is DarkTidesHorn )
					{
						if ( player.Young )
						{
							DarkTidesHorn horn = (DarkTidesHorn)dropped;

							if ( horn.Charges < 10 )
							{
								SayTo( from, 1049384 ); // I have recharged the item for you.
								horn.Charges = 10;
							}
							else
							{
								SayTo( from, 1049385 ); // That doesn't need recharging yet.
							}
						}
						else
						{
							player.SendLocalizedMessage(1114333); //You must be young to have this item recharged.
						}

						return false;
					}
				}
			}

			return base.OnDragDrop( from, dropped );
		}

		public override void InitOutfit()
		{
			AddItem( new Sandals( 0x1 ) );
			AddItem( new Robe( 0x66D ) );
			AddItem( new BlackStaff() );
			AddItem( new WizardsHat( 0x1 ) );

			FacialHairItemID = 0x2041;
			FacialHairHue = 0x482;

			HairItemID = 0x203C;
			HairHue = 0x482;

			Item gloves = new BoneGloves();
			gloves.Hue = 0x66D;
			AddItem( gloves );

			Item gorget = new PlateGorget();
			gorget.Hue = 0x1;
			AddItem( gorget );
		}

		public override int GetAutoTalkRange( PlayerMobile m )
		{
			return 3;
		}

		public override bool CanTalkTo( PlayerMobile to )
		{
			DarkTidesQuest qs = to.Quest as DarkTidesQuest;

			if ( qs == null )
				return ( to.Quest == null && QuestSystem.CanOfferQuest( to, typeof( DarkTidesQuest ) ) );

			return ( qs.FindObjective( typeof( FindMardothAboutVaultObjective ) ) != null );
		}

		public override void OnTalk( PlayerMobile player, bool contextMenu )
		{
			QuestSystem qs = player.Quest;

			if ( qs is DarkTidesQuest )
			{
				if ( DarkTidesQuest.HasLostCallingScroll( player ) )
				{
					qs.AddConversation( new LostCallingScrollConversation( true ) );
				}
				else
				{
					QuestObjective obj = qs.FindObjective( typeof( FindMardothAboutVaultObjective ) );

					if ( obj != null && !obj.Completed )
					{
						obj.Complete();
					}
					else
					{
						obj = qs.FindObjective( typeof( FindMardothAboutKronusObjective ) );

						if ( obj != null && !obj.Completed )
						{
							obj.Complete();
						}
						else
						{
							obj = qs.FindObjective( typeof( FindMardothEndObjective ) );

							if ( obj != null && !obj.Completed )
							{
								Container cont = GetNewContainer();

								cont.DropItem( new PigIron( 20 ) );
								cont.DropItem( new NoxCrystal( 20 ) );
								cont.DropItem( new BatWing( 25 ) );
								cont.DropItem( new DaemonBlood( 20 ) );
								cont.DropItem( new GraveDust( 20 ) );

								BaseWeapon weapon = new BoneHarvester();

								weapon.Slayer = SlayerName.OrcSlaying;

								if ( Core.AOS )
								{
									BaseRunicTool.ApplyAttributesTo( weapon, 3, 20, 40 );
								}
								else
								{
									weapon.DamageLevel = (WeaponDamageLevel)BaseCreature.RandomMinMaxScaled( 2, 4 );
									weapon.AccuracyLevel = (WeaponAccuracyLevel)BaseCreature.RandomMinMaxScaled( 2, 4 );
									weapon.DurabilityLevel = (WeaponDurabilityLevel)BaseCreature.RandomMinMaxScaled( 2, 4 );
								}

								cont.DropItem( weapon );

								cont.DropItem( new BankCheck( 2000 ) );
								cont.DropItem( new EnchantedSextant() );

								if ( !player.PlaceInBackpack( cont ) )
								{
									cont.Delete();
									player.SendLocalizedMessage( 1046260 ); // You need to clear some space in your inventory to continue with the quest.  Come back here when you have more space in your inventory.
								}
								else
								{
									obj.Complete();
								}
							}
							else if ( contextMenu )
							{
								FocusTo( player );
								player.SendLocalizedMessage( 1061821 ); // Mardoth has nothing more for you at this time.
							}
						}
					}
				}
			}
			else if ( qs == null && QuestSystem.CanOfferQuest( player, typeof( DarkTidesQuest ) ) )
			{
				new DarkTidesQuest( player ).SendOffer();
			}
		}

		public override void OnMovement( Mobile m, Point3D oldLocation )
		{
			base.OnMovement( m, oldLocation );

			if ( m is PlayerMobile && !m.Frozen && !m.Alive && InRange( m, 4 ) && !InRange( oldLocation, 4 ) && InLOS( m ) )
			{
				if ( m.Map == null || !m.Map.CanFit( m.Location, 16, false, false ) )
				{
					m.SendLocalizedMessage( 502391 ); // Thou can not be resurrected there!
				}
				else
				{
					Direction = GetDirectionTo( m );

					m.PlaySound( 0x214 );
					m.FixedEffect( 0x376A, 10, 16 );

					m.CloseGump( typeof( ResurrectGump ) );
					m.SendGump( new ResurrectGump( m, ResurrectMessage.Healer ) );
				}
			}
		}

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

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int) 0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}
	}
}