package util

import "strconv"

const (
	TSO_FACTOR = 1000
)

func ParseTSOFromTSString(tsString string) (uint64, error) {
	return strconv.ParseUint(tsString, 10, 64)
}

func ParseTSFromTSString(tsString string) (int64, error) {
	tso, err := strconv.ParseUint(tsString, 10, 64)
	if err != nil {
		return 0, err
	}
	ts := TransToTS(tso)
	return ts, nil
}

// timestamp to tso
func TransToTSO(ts int64) uint64 {
	return uint64((ts << 18) * TSO_FACTOR)
}

func TransToTSOStr(ts int64) string {
	tso := TransToTSO(ts)
	return strconv.FormatUint(tso, 10)
}

// tso to timestamp
func TransToTS(tso uint64) int64 {
	return int64((tso / TSO_FACTOR) >> 18)
}

func CompareTSOStr(tsoStr, comparedTSOStr string) (int, error) {
	tso, err := ParseTSOFromTSString(tsoStr)
	if err != nil {
		return 0, err
	}
	comparedTSO, err := ParseTSOFromTSString(comparedTSOStr)
	if err != nil {
		return 0, err
	}

	if tso == comparedTSO {
		return 0, nil
	} else if tso > comparedTSO {
		return 1, nil
	} else {
		return -1, nil
	}
}
