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

namespace Server.Spells.Bushido
{
    public abstract class SamuraiSpell : Spell
    {
        public SamuraiSpell(Mobile caster, Item scroll, SpellInfo info)
            : base(caster, scroll, info)
        {
        }

        public abstract double RequiredSkill { get; }
        public abstract int RequiredMana { get; }
        public override SkillName CastSkill
        {
            get
            {
                return SkillName.Bushido;
            }
        }
        public override SkillName DamageSkill
        {
            get
            {
                return SkillName.Bushido;
            }
        }
        public override bool ClearHandsOnCast
        {
            get
            {
                return false;
            }
        }
        public override bool BlocksMovement
        {
            get
            {
                return false;
            }
        }
        public override bool ShowHandMovement
        {
            get
            {
                return false;
            }
        }
        //public override int CastDelayBase{ get{ return 1; } }
        public override double CastDelayFastScalar
        {
            get
            {
                return 0;
            }
        }
        public override int CastRecoveryBase
        {
            get
            {
                return 7;
            }
        }
        public static bool CheckExpansion(Mobile from)
        {
            if (!Core.SE)
                return false;

            if (!(from is PlayerMobile))
                return true;

            if (from.NetState == null)
                return false;

            return from.NetState.SupportsExpansion(Expansion.SE);
        }

        public static void OnEffectEnd(Mobile caster, Type type)
        {
            int spellID = SpellRegistry.GetRegistryNumber(type);

            if (spellID > 0)
                caster.Send(new ToggleSpecialAbility(spellID + 1, false));
        }

        public override bool CheckCast()
        {
            int mana = this.ScaleMana(this.RequiredMana);

            if (!base.CheckCast())
                return false;

            if (!CheckExpansion(this.Caster))
            {
                this.Caster.SendLocalizedMessage(1063456); // You must upgrade to Samurai Empire in order to use that ability.
                return false;
            }

            if (this.Caster.Skills[this.CastSkill].Value < this.RequiredSkill)
            {
                string args = String.Format("{0}\t{1}\t ", this.RequiredSkill.ToString("F1"), this.CastSkill.ToString());
                this.Caster.SendLocalizedMessage(1063013, args); // You need at least ~1_SKILL_REQUIREMENT~ ~2_SKILL_NAME~ skill to use that ability.
                return false;
            }
            else if (this.Caster.Mana < mana)
            {
                this.Caster.SendLocalizedMessage(1060174, mana.ToString()); // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability.
                return false;
            }

            return true;
        }

        public override bool CheckFizzle()
        {
            int mana = this.ScaleMana(this.RequiredMana);

            if (this.Caster.Skills[this.CastSkill].Value < this.RequiredSkill)
            {
                this.Caster.SendLocalizedMessage(1070768, this.RequiredSkill.ToString("F1")); // You need ~1_SKILL_REQUIREMENT~ Bushido skill to perform that attack!
                return false;
            }
            else if (this.Caster.Mana < mana)
            {
                this.Caster.SendLocalizedMessage(1060174, mana.ToString()); // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability.
                return false;
            }

            if (!base.CheckFizzle())
                return false;

            this.Caster.Mana -= mana;

            return true;
        }

        public override void GetCastSkills(out double min, out double max)
        {
            min = this.RequiredSkill - 12.5;	//per 5 on friday, 2/16/07
            max = this.RequiredSkill + 37.5;
        }

        public override int GetMana()
        {
            return 0;
        }

        public virtual void OnCastSuccessful(Mobile caster)
        {
            if (Evasion.IsEvading(caster))
                Evasion.EndEvasion(caster);

            if (Confidence.IsConfident(caster))
                Confidence.EndConfidence(caster);

            if (CounterAttack.IsCountering(caster))
                CounterAttack.StopCountering(caster);

            int spellID = SpellRegistry.GetRegistryNumber(this);

            if (spellID > 0)
                caster.Send(new ToggleSpecialAbility(spellID + 1, true));
        }
    }
}