namespace PkmnLib.Plugin.Gen7.Scripts.Side;

[Script(ScriptCategory.Side, "stealth_rock")]
public class StealthRockEffect : Script, IScriptOnSwitchIn, IAIInfoScriptExpectedEntryDamage
{
    /// <inheritdoc />
    public void OnSwitchIn(IPokemon pokemon, byte position)
    {
        var damage = CalculateStealthRockDamage(pokemon);
        EventBatchId batchId = new();
        pokemon.Damage(damage, DamageSource.Misc, batchId);
        pokemon.BattleData?.Battle.EventHook.Invoke(new DialogEvent("stealth_rock_damage",
            new Dictionary<string, object>
            {
                { "pokemon", pokemon },
            }));
    }

    private static uint CalculateStealthRockDamage(IPokemon pokemon)
    {
        var typeLibrary = pokemon.Library.StaticLibrary.Types;
        var effectiveness = 1.0f;
        if (typeLibrary.TryGetTypeIdentifier("rock", out var rockType))
        {
            effectiveness = typeLibrary.GetEffectiveness(rockType, pokemon.Types);
        }
        return (uint)(pokemon.MaxHealth / 8f * effectiveness);
    }

    /// <inheritdoc />
    public void ExpectedEntryDamage(IPokemon pokemon, ref uint damage)
    {
        damage += CalculateStealthRockDamage(pokemon);
    }
}