using PkmnLib.Dynamic.Libraries;
using PkmnLib.Dynamic.Models;
using PkmnLib.Static;
using PkmnLib.Static.Moves;
using PkmnLib.Static.Utils;

namespace PkmnLib.Dynamic.AI;

/// <summary>
/// Helper functions for AI
/// </summary>
public static class AIHelpers
{
    /// <summary>
    /// Estimates the amount of damage that will be done by a move against a target.
    /// </summary>
    public static uint CalculateDamageEstimation(IMoveData move, IPokemon user, IPokemon target,
        IDynamicLibrary library)
    {
        var hitData = new CustomHitData
        {
            BasePower = move.BasePower,
            Effectiveness = library.StaticLibrary.Types.GetEffectiveness(move.MoveType, target.Types),
            Type = move.MoveType,
        };
        return library.DamageCalculator.GetDamage(null, move.Category, user, target, 1, 0, hitData);
    }

    private class CustomHitData : IHitData
    {
        /// <inheritdoc />
        public bool IsCritical => false;

        /// <inheritdoc />
        public ushort BasePower { get; init; }

        /// <inheritdoc />
        public float Effectiveness { get; init; }

        /// <inheritdoc />
        public uint Damage => 0;

        /// <inheritdoc />
        public TypeIdentifier? Type { get; init; }

        /// <inheritdoc />
        public bool IsContact => false;

        /// <inheritdoc />
        public bool HasFailed => false;

        /// <inheritdoc />
        public void Fail()
        {
        }

        /// <inheritdoc />
        public void SetFlag(StringKey flag)
        {
        }

        /// <inheritdoc />
        public bool HasFlag(StringKey flag) => false;
    }
}