package utils

import (
	"math"
	"os"
	"time"

	"github.com/fiskerinc/cloud-services/pkg/logger"
	"github.com/intel-go/fastjson"
	"github.com/sony/gobreaker"
)

// Converts float64 (as decimal seconds in unix epoch) to Time.Time struct
func FloatToTime(float float64) time.Time {
	s := int64(math.Floor(float))
	ns := int64((float - math.Floor(float)) * 1e9)
	return time.Unix(
		s,
		ns,
	)
}

func TimeToFloat(timestamp time.Time) float64 {
	return float64(timestamp.UnixNano()) / 1e9
}

func FixFloatTimestampScale(float float64) float64 {
	for float > 9999999999 {
		float /= 1000
	}
	return float
}

// marchTimer increments the value at timer until newTime has been reached.
// This is used to try to maintain consistent downsample and insertion periods.
func MarchTimer(timer *time.Time, newTime *time.Time, delay time.Duration) {
	for timer.Before(*newTime) {
		*timer = timer.Add(delay)
	}
}

func ReadVarListFromFile(varsFile string) []string {
	data, err := os.ReadFile(varsFile)
	if err != nil {
		// when running tests, pwd is in the wrong directory to find the default json files.
		os.Chdir("..")
		data, err = os.ReadFile(varsFile)
		if err != nil {
			panic(err)
		}
	}

	var result []string
	err = fastjson.Unmarshal(data, &result)
	if err != nil {
		panic(err)
	}
	return result
}

func BreakerStateChange(name string, from gobreaker.State, to gobreaker.State) {
	logger.Warn().Stack().Msgf("%s breaker change from %d to %d", name, from, to)
}
