using PkmnLib.Dynamic.Models;
using PkmnLib.Plugin.Gen7.Moves;
using PkmnLib.Static;

namespace PkmnLib.Plugin.Gen7.Tests.Scripts.Moves;

public class AcrobaticsTests
{
    [Test]
    public void ChangeBasePower_UserNotHoldingItem_BasePowerDoubles()
    {
        // Arrange
        var move = new Mock<IExecutingMove>();
        var target = new Mock<IPokemon>();
        byte basePower = 10;
        move.Setup(m => m.User).Returns(new Mock<IPokemon>().Object);
        move.Setup(m => m.User.HeldItem).Returns((IItem?)null);
        var acrobatics = new Acrobatics();

        // Act
        acrobatics.ChangeBasePower(move.Object, target.Object, 0, ref basePower);

        // Assert
        Assert.That(basePower, Is.EqualTo(20));
    }
    
    [Test]
    public void ChangeBasePower_UserHoldingItem_BasePowerUnchanged()
    {
        // Arrange
        var move = new Mock<IExecutingMove>();
        var target = new Mock<IPokemon>();
        byte basePower = 10;
        move.Setup(m => m.User).Returns(new Mock<IPokemon>().Object);
        move.Setup(m => m.User.HeldItem).Returns(new Mock<IItem>().Object);
        var acrobatics = new Acrobatics();

        // Act
        acrobatics.ChangeBasePower(move.Object, target.Object, 0, ref basePower);

        // Assert
        Assert.That(basePower, Is.EqualTo(10));
    }

    [Test]
    public void ChangeBasePower_UserNotHoldingItem_NoOverflow()
    {
        // Arrange
        var move = new Mock<IExecutingMove>();
        var target = new Mock<IPokemon>();
        byte basePower = 200;
        move.Setup(m => m.User).Returns(new Mock<IPokemon>().Object);
        move.Setup(m => m.User.HeldItem).Returns((IItem?)null);
        var acrobatics = new Acrobatics();

        // Act
        acrobatics.ChangeBasePower(move.Object, target.Object, 0, ref basePower);

        // Assert
        Assert.That(basePower, Is.EqualTo(byte.MaxValue));
    }
    
}