namespace PkmnLib.Plugin.Gen7.Scripts;

public static class CustomTriggers
{
    public static readonly StringKey AuroraVeilDuration = "aurora_veil_duration";

    public record AuroraVeilDurationArgs(IExecutingMove Move, int Duration) : ICustomTriggerArgs
    {
        public int Duration { get; set; } = Duration;
    }

    public static readonly StringKey ModifyBind = "modify_bind";

    public record ModifyBindArgs(IExecutingMove Move) : ICustomTriggerArgs
    {
        public int Duration { get; set; } = 5;
        public float DamagePercent { get; set; } = 1f / 8f;
    }

    public static readonly StringKey IgnoreHail = "ignores_hail";

    public record IgnoreHailArgs(IPokemon Pokemon) : ICustomTriggerArgs
    {
        public bool Ignore { get; set; } = false;
    }

    public static readonly StringKey LightScreenNumberOfTurns = "light_screen_number_of_turns";

    public record LightScreenNumberOfTurnsArgs(IExecutingMove Move, int Duration) : ICustomTriggerArgs
    {
        public int Duration { get; set; } = Duration;
    }

    public static readonly StringKey ReflectNumberOfTurns = "reflect_number_of_turns";

    public record ReflectNumberOfTurnsArgs(IExecutingMove Move, int Duration) : ICustomTriggerArgs
    {
        public int Duration { get; set; } = Duration;
    }

    public static readonly StringKey BypassSleep = "bypass_sleep";

    public record BypassSleepArgs(IMoveChoice Choice, bool Bypass) : ICustomTriggerArgs
    {
        public bool Bypass { get; set; } = Bypass;
    }

    public static readonly StringKey Whirlpool = "whirlpool";

    public record WhirlpoolArgs(IExecutingMove Move, IPokemon Target, byte HitIndex, int Turns, float DamagePercent)
        : ICustomTriggerArgs
    {
        public int Turns { get; set; } = Turns;
        public float DamagePercent { get; set; } = DamagePercent;
    }

    public static readonly StringKey ModifyAuraEffect = "modify_aura_effect";

    public record ModifyAuraEffectArgs(IExecutingMove Move, IPokemon Target, byte HitIndex, float AuraEffect)
        : ICustomTriggerArgs
    {
        public float AuraEffect { get; set; } = AuraEffect;
    }

    public static readonly StringKey BypassChargeMove = "bypass_charge_move";

    public record BypassChargeMoveArgs(IExecutingMove Move, bool Bypass) : ICustomTriggerArgs
    {
        public bool Bypass { get; set; } = Bypass;
    }

    public static readonly StringKey ModifySleepTurns = "modify_sleep_turns";

    public record ModifySleepTurnsArgs(IPokemon Pokemon, int Turns) : ICustomTriggerArgs
    {
        public int Turns { get; set; } = Turns;
    }

    public static readonly StringKey BypassProtection = "bypass_protection";

    public record BypassProtectionArgs(IExecutingMove Move, IPokemon Target, byte HitIndex, bool Bypass)
        : ICustomTriggerArgs
    {
        public bool Bypass { get; set; } = Bypass;
    }

    public static readonly StringKey BypassSubstitute = "bypass_subsitute";

    public record BypassSubstituteArgs(IExecutingMove Move, IPokemon Target, byte HitIndex, bool Bypass)
        : ICustomTriggerArgs
    {
        public bool Bypass { get; set; } = Bypass;
    }

    public static readonly StringKey ModifyDrain = "modify_drain";

    public record ModifyDrainArgs(IExecutingMove Move, IPokemon Target, byte Hit, uint Damage, uint Healed, bool Invert)
        : ICustomTriggerArgs
    {
        public uint Healed { get; set; } = Healed;
        public bool Invert { get; set; } = Invert;
    }

    public static readonly StringKey ModifyHealPercent = "modify_heal_percent";

    public record ModifyHealPercentArgs(IExecutingMove Move, IPokemon Target, byte Hit, float HealPercent)
        : ICustomTriggerArgs
    {
        public float HealPercent { get; set; } = HealPercent;
    }

    public static readonly StringKey PoisonedDamage = "poisoned_damage";

    public record PoisonedDamageArgs(IPokemon Pokemon, uint Damage) : ICustomTriggerArgs
    {
        public uint Damage { get; set; } = Damage;
        public bool Invert { get; set; } = false;
    }

    public static readonly StringKey ModifyRecoil = "modify_recoil";

    public record ModifyRecoilArgs(IExecutingMove Move, IPokemon Target, byte Hit, uint Damage, uint Recoil)
        : ICustomTriggerArgs
    {
        public uint Recoil { get; set; } = Recoil;
        public bool Prevent { get; set; } = false;
    }

    public static readonly StringKey Modify2_5HitMove = "modify_2_5_hit_move";

    public record Modify2_5HitMoveArgs(IMoveChoice moveChoice, byte NumberOfHits) : ICustomTriggerArgs
    {
        public byte NumberOfHits { get; set; } = NumberOfHits;
    }

    public static readonly StringKey OnFlinch = "on_flinch";

    public record OnFlinchArgs(IExecutingMove Move) : ICustomTriggerArgs
    {
        public bool Prevent { get; set; } = false;
    }

    public static readonly StringKey BypassSandstormDamage = "bypass_sandstorm_damage";

    public record BypassSandstormDamageArgs(IPokemon Pokemon) : ICustomTriggerArgs
    {
        public bool Bypass { get; set; } = false;
    }
}