package client

import (
	"context"
	"math"
	"time"

	"go.unistack.org/micro/v3/util/backoff"
)

// BackoffFunc is the backoff call func
type BackoffFunc func(ctx context.Context, req Request, attempts int) (time.Duration, error)

// BackoffExp using exponential backoff func
func BackoffExp(_ context.Context, _ Request, attempts int) (time.Duration, error) {
	return backoff.Do(attempts), nil
}

// BackoffInterval specifies randomization interval for backoff func
func BackoffInterval(minTime time.Duration, maxTime time.Duration) BackoffFunc {
	return func(_ context.Context, _ Request, attempts int) (time.Duration, error) {
		td := time.Duration(math.Pow(float64(attempts), math.E)) * time.Millisecond * 100
		if td < minTime {
			return minTime, nil
		} else if td > maxTime {
			return maxTime, nil
		}
		return td, nil
	}
}