package main

import (
	"fmt"
	"strings"
	"time"

	"golang.org/x/text/language"
	"golang.org/x/text/message"
)

var (
	printer = message.NewPrinter(language.English)
)

// TimeDifference will return the FormattedTime of time.Unix().Now() - lastBeat
func TimeDifference(lastBeat int64, t time.Time) string {
	st := t.Sub(time.Unix(lastBeat, 0))
	return FormattedTime(int64(st.Seconds()))
}

// FormattedTime will turn seconds into a pretty time representation
func FormattedTime(secondsIn int64) string {
	hours := secondsIn / 3600
	minutes := (secondsIn / 60) - (60 * hours)
	seconds := secondsIn % 60

	units := make([]string, 0)
	if hours != 0 {
		units = append(units, joinIntAndStr(hours, "hour"))
	}
	if minutes != 0 {
		units = append(units, joinIntAndStr(minutes, "minute"))
	}
	if seconds != 0 || (hours == 0 && minutes == 0) {
		units = append(units, joinIntAndStr(seconds, "second"))
	}

	return strings.Join(units, ", ")
}

// FormattedNum will insert commas as necessary in large numbers
func FormattedNum(num int64) string {
	return printer.Sprintf("%d", num)
}

// FormattedUTCData will return the Unix time as a spreadsheet data string
func FormattedUTCData(unix int64) string {
	return time.Unix(unix, 0).In(time.UTC).Format("2006/01/02 15:04")
}

func joinIntAndStr(int int64, str string) string {
	plural := "s"
	if int == 1 {
		plural = ""
	}
	return fmt.Sprintf("%s %s%s", FormattedNum(int), str, plural)
}