using PkmnLib.Dynamic.Events;
using PkmnLib.Dynamic.Models;
using PkmnLib.Static;

namespace PkmnLib.Dynamic.ScriptHandling;

/// <summary>
/// Base class for Pokéball scripts.
/// </summary>
public abstract class PokeballScript : ItemScript
{
    /// <inheritdoc />
    protected PokeballScript(IItem item) : base(item)
    {
    }

    /// <summary>
    /// Returns the catch rate of the Pokéball against the given target Pokémon.
    /// </summary>
    public abstract void ChangeCatchRate(IPokemon target, ref byte catchRate);

    public virtual void OnAfterSuccessfulCapture(IPokemon target)
    {
        // Default implementation does nothing.
        // Override this method in derived classes to add custom behavior after a successful capture.
    }

    /// <inheritdoc />
    public override bool IsItemUsable => true;

    /// <inheritdoc />
    public override ItemTargetType TargetType => ItemTargetType.FoePokemon;

    /// <inheritdoc />
    public override bool IsTargetValid(IPokemon target) =>
        target.BattleData is not null && target.BattleData.Battle.IsWildBattle;

    /// <inheritdoc />
    public override void OnUseWithTarget(IPokemon target, EventHook eventHook)
    {
        var battleData = target.BattleData;

        var result = battleData?.Battle.AttempCapture(battleData.SideIndex, battleData.Position, Item);
        if (result is { IsCaught: true })
        {
            OnAfterSuccessfulCapture(target);
        }
    }
}