package error

import (
	"fmt"
	"time"

	"github.com/pingcap/errors"
)

type RequeueAfterError struct {
	Caused error
	// RequeueAfter is the duration after which the request should be enqueued again.
	RequeueAfter time.Duration
}

func New(requeueAfter time.Duration, cause error) *RequeueAfterError {
	return &RequeueAfterError{
		Caused:       cause,
		RequeueAfter: requeueAfter,
	}
}

func (e *RequeueAfterError) Cause() error {
	return e.Caused
}

func (e *RequeueAfterError) Error() string {
	if e.Caused == nil {
		return fmt.Sprintf("requeue in %s", e.RequeueAfter)
	}

	return fmt.Sprintf("requeue in %s due to %s", e.RequeueAfter, errors.Cause(e.Caused))
}
