using PkmnLib.Static.Moves;

namespace PkmnLib.Plugin.Gen7.Scripts.Moves;

[Script(ScriptCategory.Move, "mirror_coat")]
public class MirrorCoat : Script, IScriptOnBeforeTurnStart, IScriptChangeMoveDamage
{
    /// <inheritdoc />
    public void OnBeforeTurnStart(ITurnChoice choice)
    {
        choice.User.Volatile.Add(new MirrorCoatHelper());
    }

    /// <inheritdoc />
    public void ChangeMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage)
    {
        var helper = target.Volatile.Get<MirrorCoatHelper>();

        if (helper?.LastAttacker == null || helper.LastAttacker != move.User)
        {
            move.GetHitData(target, hit).Fail();
            return;
        }

        damage = helper.LastDamage.MultiplyOrMax(2f);
        target.Volatile.Remove<MirrorCoatHelper>();
    }

    [Script(ScriptCategory.Pokemon, "mirror_coat_helper")]
    private class MirrorCoatHelper : Script, IScriptOnIncomingHit, IScriptOnEndTurn
    {
        public IPokemon? LastAttacker { get; set; }
        public uint LastDamage { get; set; }

        /// <inheritdoc />
        public void OnIncomingHit(IExecutingMove move, IPokemon target, byte hit)
        {
            if (move.UseMove.Category != MoveCategory.Special)
                return;
            LastAttacker = move.User;
            LastDamage = move.GetHitData(target, hit).Damage;
        }

        /// <inheritdoc />
        public void OnEndTurn(IScriptSource owner, IBattle battle)
        {
            RemoveSelf();
        }
    }
}