//nolint:gomnd
package workflow

import (
	"context"
	"time"

	"github.com/avast/retry-go/v4"
	"go.uber.org/zap"
)

type Retryer interface {
	Execute(ctx context.Context, logger *zap.Logger, runF func() error) error
}

type retryerImpl struct {
	needWaitErrs []error
}

func NewRetryer(errList []error) Retryer {
	return &retryerImpl{needWaitErrs: errList}
}

func (e *retryerImpl) Execute(ctx context.Context, logger *zap.Logger, runF func() error) error {
	return retry.Do(func() error {
		return runF()
	},
		retry.Context(ctx),
		retry.DelayType(retry.FixedDelay),
		retry.Delay(time.Second*15),
		retry.Attempts(0),
		retry.OnRetry(func(n uint, err error) {
			logger.Warn("action run error", zap.Uint("retry_times", n), zap.Error(err))
		}),
		retry.RetryIf(func(err error) bool {
			for _, e := range e.needWaitErrs {
				if err == e {
					return true
				}
			}
			return false
		}),
		retry.LastErrorOnly(true),
	)
}
