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

namespace PkmnLib.Dynamic.Libraries;

/// <summary>
/// A battle stat calculator is used to calculate stats for a Pokemon.
/// </summary>
public interface IBattleStatCalculator
{
    /// <summary>
    /// Calculate all the flat stats of a Pokemon, disregarding stat boosts.
    /// </summary>
    void CalculateFlatStats(IPokemon pokemon, StatisticSet<uint> stats);
    
    /// <summary>
    /// Calculate a single flat stat of a Pokemon, disregarding stat boosts.
    /// </summary>
    uint CalculateFlatStat(IPokemon pokemon, Statistic stat);
    
    /// <summary>
    /// Calculate all the boosted stats of a Pokemon, including stat boosts.
    /// </summary>
    void CalculateBoostedStats(IPokemon pokemon, StatisticSet<uint> stats);
    
    /// <summary>
    /// Calculate a single boosted stat of a Pokemon, including stat boosts.
    /// </summary>
    uint CalculateBoostedStat(IPokemon pokemon, Statistic stat);
    
    /// <summary>
    /// Calculates the accuracy for a move, taking into account any accuracy modifiers.
    /// </summary>
    byte CalculateModifiedAccuracy(IExecutingMove executingMove, IPokemon target, byte hitIndex, byte moveAccuracy);
}