using Server.Items;
using Server.Regions;
using System;

namespace Server.Engines.Quests
{
    public class FreedomQuest : BaseQuest
    {
        public override bool DoneOnce => true;

        public FreedomQuest()
            : base()
        {
            AddObjective(new EscortObjective("Sanctuary Entrance"));

            AddReward(new BaseReward(typeof(StolenRing), "Lenley's Favorite Sparkly"));
        }

        /* Freedom! */
        public override object Title => 1072367;

        /*
         * Lenley isn't seen.  Why you see me? Lenley is sneaking.  Lenley runs away.
         * You help Lenley to not get dead?  We go out past pig-men orcs?  Yes? Yes? You say yes?
        */
        public override object Description => 1072552;

        /* You no like Lenley? No hurt Lenley!  No see Lenley.  Go 'way. */
        public override object Refuse => 1072553;

        /* Lenley not run away yet.  Go, go, Lenley not past pig-men orcs.  You go, Lenley go after you.  Go! */
        public override object Uncomplete => 1072554;

        /* Lenley so happy!  Lenley not get dead.  You have best Lenley shiny! */
        public override object Complete => 1072556;

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

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();
        }
    }

    public class Lenley : BaseEscort
    {
        public override Type[] Quests => new Type[] { typeof(FreedomQuest) };

        public LenleyRegion _Region { get; set; }

        [Constructable]
        public Lenley()
            : base()
        {
            Name = "Lenley";
            Title = "the Snitch";
            Body = 0x2A;
            Hidden = true;
            CantWalk = true;

            SetStr(96, 120);
            SetDex(81, 100);
            SetInt(36, 60);

            SetHits(58, 72);

            SetDamage(4, 5);

            SetDamageType(ResistanceType.Physical, 100);

            SetResistance(ResistanceType.Physical, 25, 30);
            SetResistance(ResistanceType.Fire, 10, 20);
            SetResistance(ResistanceType.Cold, 10, 20);
            SetResistance(ResistanceType.Poison, 10, 20);
            SetResistance(ResistanceType.Energy, 10, 20);

            SetSkill(SkillName.MagicResist, 35.1, 60.0);
            SetSkill(SkillName.Tactics, 50.1, 75.0);
            SetSkill(SkillName.Wrestling, 50.1, 75.0);
            SetSkill(SkillName.Hiding, 75.0);

            Fame = 1500;
            Karma = 1500;
        }

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

        public override void RevealingAction()
        {
            if (_Region != null)
                _Region.Unregister();

            CantWalk = false;

            base.RevealingAction();
        }

        public override void OnDelete()
        {
            DeleteLenleyRegion();

            base.OnDelete();
        }

        public void DeleteLenleyRegion()
        {
            if (_Region != null)
                _Region.Unregister();
        }

        protected override void OnLocationChange(Point3D oldLocation)
        {
            if (Deleted)
                return;

            UpdateLenleyRegion();
        }

        protected override void OnMapChange(Map oldMap)
        {
            if (Deleted)
                return;

            UpdateLenleyRegion();
        }

        public void UpdateLenleyRegion()
        {
            if (Hidden)
            {
                DeleteLenleyRegion();

                if (!Deleted && Map != Map.Internal)
                {
                    _Region = new LenleyRegion(this);
                    _Region.Register();
                }
            }
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write(0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            int version = reader.ReadInt();

            if (Hidden)
            {
                Timer.DelayCall(TimeSpan.Zero, UpdateLenleyRegion);
            }
        }
    }

    public class LenleyRegion : BaseRegion
    {
        public LenleyRegion(Mobile lenley)
            : base(null, lenley.Map, Find(lenley.Location, lenley.Map), new Rectangle2D(lenley.Location.X - 2, lenley.Location.Y - 2, 5, 5))
        {
        }

        public override void OnEnter(Mobile m)
        {
            m.SendLocalizedMessage(1075014); // Psst!  Lenley isn't seen.  You help Lenley?
        }
    }
}