namespace PkmnLib.Plugin.Gen7.Scripts.Side;

[Script(ScriptCategory.Side, "spikes")]
public class SpikesEffect : Script, IScriptOnSwitchIn, IScriptStack, IAIInfoScriptExpectedEntryDamage
{
    private int _layers = 1;

    /// <inheritdoc />
    public void Stack()
    {
        if (_layers < 3)
            _layers++;
    }

    /// <inheritdoc />
    public void OnSwitchIn(IPokemon pokemon, byte position)
    {
        if (pokemon.IsFloating)
            return;

        var damage = CalculateDamage(pokemon);

        EventBatchId eventBatch = new();
        pokemon.Damage(damage, DamageSource.Misc, eventBatch);
        pokemon.BattleData?.Battle.EventHook.Invoke(new DialogEvent("spikes_damage", new Dictionary<string, object>
        {
            { "pokemon", pokemon },
        })
        {
            BatchId = eventBatch,
        });
    }

    private uint CalculateDamage(IPokemon pokemon)
    {
        var modifier = _layers switch
        {
            1 => 1 / 16f,
            2 => 3 / 16f,
            3 => 1 / 4f,
            _ => throw new ArgumentOutOfRangeException(),
        };
        var damage = (uint)(pokemon.MaxHealth * modifier);
        return damage;
    }

    /// <inheritdoc />
    public void ExpectedEntryDamage(IPokemon pokemon, ref uint damage)
    {
        if (pokemon.IsFloating)
            return;

        damage += CalculateDamage(pokemon);
    }
}