package crypto

import (
	"time"
)

var pmCrypto = PmCrypto{}

func GetPmCrypto() *PmCrypto {
	return &pmCrypto
}

// UpdateTime update cached time
func (pm *PmCrypto) UpdateTime(newTime int64) {
	pm.latestServerTime = newTime
	pm.latestClientTime = time.Now()
}

//GetTime get latest cached time
func (pm *PmCrypto) GetTimeUnix() int64 {
	return pm.getNow().Unix()
}

//GetTime get latest cached time
func (pm *PmCrypto) GetTime() time.Time {
	return pm.getNow()
}

func (pm *PmCrypto) getNow() time.Time {
	if pm.latestServerTime > 0 && !pm.latestClientTime.IsZero() {
		// Sub is monotome, it uses a monotime time clock in this case instead of the wall clock
		extrapolate := int64(pm.latestClientTime.Sub(time.Now()).Seconds())
		return time.Unix(pm.latestServerTime+extrapolate, 0)
	}

	return time.Now()
}

func (pm *PmCrypto) getTimeGenerator() func() time.Time {
	return func() time.Time {
		return pm.getNow()
	}
}
