package bitswap

import (
	"math"
	"math/rand"
)

type StrategyFunc func(*Ledger) bool

func StandardStrategy(l *Ledger) bool {
	return rand.Float64() <= probabilitySend(l.Accounting.Value())
}

func YesManStrategy(l *Ledger) bool {
	return true
}

func probabilitySend(ratio float64) float64 {
	x := 1 + math.Exp(6-3*ratio)
	y := 1 / x
	return 1 - y
}

type debtRatio struct {
	BytesSent uint64
	BytesRecv uint64
}

func (dr *debtRatio) Value() float64 {
	return float64(dr.BytesSent) / float64(dr.BytesRecv+1)
}