package graphite

import (
	"testing"
	"time"
)

func TestParseIntervalSuccess(t *testing.T) {
	f := func(s string, intervalExpected int64) {
		t.Helper()
		interval, err := parseInterval(s)
		if err != nil {
			t.Fatalf("unexpected error in parseInterval(%q): %s", s, err)
		}
		if interval != intervalExpected {
			t.Fatalf("unexpected result for parseInterval(%q); got %d; want %d", s, interval, intervalExpected)
		}
	}
	f(`1ms`, 1)
	f(`-10.5ms`, -10)
	f(`+5.5s`, 5500)
	f(`7.85s`, 7850)
	f(`-7.85sec`, -7850)
	f(`-7.85secs`, -7850)
	f(`5seconds`, 5000)
	f(`10min`, 10*60*1000)
	f(`10 mins`, 10*60*1000)
	f(` 10  mins `, 10*60*1000)
	f(`10m`, 10*60*1000)
	f(`-10.5min`, -10.5*60*1000)
	f(`-10.5m`, -10.5*60*1000)
	f(`3minutes`, 3*60*1000)
	f(`3h`, 3*3600*1000)
	f(`-4.5hour`, -4.5*3600*1000)
	f(`7hours`, 7*3600*1000)
	f(`5d`, 5*24*3600*1000)
	f(`-3.5days`, -3.5*24*3600*1000)
	f(`0.5w`, 0.5*7*24*3600*1000)
	f(`10weeks`, 10*7*24*3600*1000)
	f(`2months`, 2*30*24*3600*1000)
	f(`2mo`, 2*30*24*3600*1000)
	f(`1.2y`, 1.2*365*24*3600*1000)
	f(`-3years`, -3*365*24*3600*1000)
}

func TestParseIntervalError(t *testing.T) {
	f := func(s string) {
		t.Helper()
		interval, err := parseInterval(s)
		if err == nil {
			t.Fatalf("expecting non-nil error for parseInterval(%q)", s)
		}
		if interval != 0 {
			t.Fatalf("unexpected non-zero interval for parseInterval(%q): %d", s, interval)
		}
	}
	f("")
	f("foo")
	f(`'1minute'`)
	f(`123`)
}

func TestParseTimeSuccess(t *testing.T) {
	startTime := time.Now()
	startTimestamp := startTime.UnixNano() / 1e6
	f := func(s string, timestampExpected int64) {
		t.Helper()
		timestamp, err := parseTime(startTime, s)
		if err != nil {
			t.Fatalf("unexpected error from parseTime(%q): %s", s, err)
		}
		if timestamp != timestampExpected {
			t.Fatalf("unexpected timestamp returned from parseTime(%q); got %d; want %d", s, timestamp, timestampExpected)
		}
	}
	f("now", startTimestamp)
	f("today", startTimestamp-startTimestamp%msecsPerDay)
	f("yesterday", startTimestamp-(startTimestamp%msecsPerDay)-msecsPerDay)
	f("1234567890", 1234567890000)
	f("18:36_20210223", 1614105360000)
	f("20210223", 1614038400000)
	f("02/23/21", 1614038400000)
	f("2021-02-23", 1614038400000)
	f("2021-02-23T18:36:12Z", 1614105372000)
	f("-3hours", startTimestamp-3*3600*1000)
	f("1.5minutes", startTimestamp+1.5*60*1000)
}

func TestParseTimeFailure(t *testing.T) {
	f := func(s string) {
		t.Helper()
		timestamp, err := parseTime(time.Now(), s)
		if err == nil {
			t.Fatalf("expecting non-nil error for parseTime(%q)", s)
		}
		if timestamp != 0 {
			t.Fatalf("expecting zero value for parseTime(%q); got %d", s, timestamp)
		}
	}
	f("")
	f("foobar")
	f("1235aafb")
}
