namespace PkmnLib.Plugin.Gen7.Scripts.Pokemon;

[Script(ScriptCategory.Pokemon, "ingrain")]
public class IngrainEffect : Script, IScriptFailIncomingMove, IScriptOnEndTurn, IScriptPreventSelfSwitch,
    IScriptPreventSelfRunAway, IScriptChangeTypesForIncomingMove
{
    private readonly IPokemon _owner;

    public IngrainEffect(IPokemon owner)
    {
        _owner = owner;
    }

    /// <inheritdoc />
    public void PreventSelfSwitch(ISwitchChoice choice, ref bool prevent) => prevent = true;

    /// <inheritdoc />
    public void PreventSelfRunAway(IFleeChoice choice, ref bool prevent) => prevent = true;

    /// <inheritdoc />
    public void OnEndTurn(IScriptSource owner, IBattle battle)
    {
        var heal = _owner.BoostedStats.Hp / 16;
        _owner.Heal(heal);
    }

    /// <inheritdoc />
    public void FailIncomingMove(IExecutingMove move, IPokemon target, ref bool fail)
    {
        if (move.UseMove.Name == "roar" || move.UseMove.Name == "whirlwind")
        {
            fail = true;
        }
    }

    /// <inheritdoc />
    public void ChangeTypesForIncomingMove(IExecutingMove executingMove, IPokemon target, byte hitIndex,
        IList<TypeIdentifier> types)
    {
        if (executingMove.UseMove.MoveType.Name == "ground")
        {
            var typeLibrary = target.Library.StaticLibrary.Types;
            // Remove all types that are immune to ground moves
            types.RemoveAll(x => typeLibrary.GetSingleEffectiveness(executingMove.UseMove.MoveType, x) == 0);
        }
    }
}