using PkmnLib.Plugin.Gen7.Scripts.Utils;

namespace PkmnLib.Plugin.Gen7.Scripts.Pokemon;

[Script(ScriptCategory.Pokemon, "dive")]
public class DiveEffect : Script, IScriptForceTurnSelection, IScriptChangeIncomingMoveDamage, IScriptBlockIncomingHit,
    IScriptOnAfterMoveChoice
{
    private readonly IPokemon _owner;

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

    /// <inheritdoc />
    public void ForceTurnSelection(IBattle battle, byte sideIndex, byte position, ref ITurnChoice? choice)
    {
        var opposingSideIndex = (byte)(_owner.BattleData?.SideIndex == 0 ? 1 : 0);
        choice = TurnChoiceHelper.CreateMoveChoice(_owner, "dive", opposingSideIndex, position);
    }

    /// <inheritdoc />
    public void BlockIncomingHit(IExecutingMove executingMove, IPokemon target, byte hitIndex, ref bool block)
    {
        if (!executingMove.UseMove.HasFlag(MoveFlags.HitUnderwater))
            block = true;
    }

    /// <inheritdoc />
    public void ChangeIncomingMoveDamage(IExecutingMove move, IPokemon target, byte hit, ref uint damage)
    {
        if (!move.UseMove.HasFlag(MoveFlags.EffectiveAgainstUnderwater))
            damage *= 2;
    }

    /// <inheritdoc />
    public void OnAfterMoveChoice(IMoveChoice moveChoice)
    {
        if (moveChoice.AdditionalData?.ContainsKey("dive_charge") != true)
        {
            RemoveSelf();
        }
    }
}