using PkmnLib.Plugin.Gen7.Scripts.Utils;

namespace PkmnLib.Plugin.Gen7.Scripts.Moves;

[Script(ScriptCategory.Move, "metronome")]
public class Metronome : Script, IScriptChangeMove
{
    /// <inheritdoc />
    public void ChangeMove(IMoveChoice choice, ref StringKey moveName)
    {
        var battleData = choice.User.BattleData;
        if (battleData == null)
            return;

        var library = choice.User.Library;
        var moveLibrary = library.StaticLibrary.Moves;

        var retryCount = 0;
        while (true)
        {
            // Breaker for infinite loop. The odds that we'd accidentally roll a non-copyable move 100 times in a row 
            // is extremely unlikely, unless the loaded move library only contains non-copyable moves.
            // This is a failsafe.
            if (retryCount > 100)
                throw new Exception("Metronome failed to find a valid move after 100 attempts.");
            var randomMove = moveLibrary.GetRandom(battleData.Battle.Random);
            if (!randomMove.CanCopyMove())
            {
                retryCount++;
                continue;
            }
            moveName = randomMove.Name;
            break;
        }
    }
}