package delay

import (
	"math/rand"
	"time"

	"github.com/Luzifer/twitch-bot/plugins"
	"github.com/go-irc/irc"
)

func Register(args plugins.RegistrationArguments) error {
	args.RegisterActor(func() plugins.Actor { return &actor{} })

	return nil
}

type actor struct {
	Delay       time.Duration `json:"delay" yaml:"delay"`
	DelayJitter time.Duration `json:"delay_jitter" yaml:"delay_jitter"`
}

func (a actor) Execute(c *irc.Client, m *irc.Message, r *plugins.Rule, eventData map[string]interface{}) (preventCooldown bool, err error) {
	if a.Delay == 0 && a.DelayJitter == 0 {
		return false, nil
	}

	totalDelay := a.Delay
	if a.DelayJitter > 0 {
		totalDelay += time.Duration(rand.Int63n(int64(a.DelayJitter))) // #nosec: G404 // It's just time, no need for crypto/rand
	}

	time.Sleep(totalDelay)
	return false, nil
}

func (a actor) IsAsync() bool { return false }
func (a actor) Name() string  { return "delay" }