package insertutils

import (
	"testing"

	"github.com/VictoriaMetrics/VictoriaMetrics/lib/logstorage"
)

func TestExtractTimestampRFC3339NanoFromFields_Success(t *testing.T) {
	f := func(timeField string, fields []logstorage.Field, nsecsExpected int64) {
		t.Helper()

		nsecs, err := ExtractTimestampRFC3339NanoFromFields(timeField, fields)
		if err != nil {
			t.Fatalf("unexpected error: %s", err)
		}
		if nsecs != nsecsExpected {
			t.Fatalf("unexpected nsecs; got %d; want %d", nsecs, nsecsExpected)
		}

		for _, f := range fields {
			if f.Name == timeField {
				if f.Value != "" {
					t.Fatalf("unexpected value for field %s; got %q; want %q", timeField, f.Value, "")
				}
			}
		}
	}

	f("time", []logstorage.Field{
		{Name: "foo", Value: "bar"},
		{Name: "time", Value: "2024-06-18T23:37:20Z"},
	}, 1718753840000000000)

	f("time", []logstorage.Field{
		{Name: "foo", Value: "bar"},
		{Name: "time", Value: "2024-06-18T23:37:20+08:00"},
	}, 1718725040000000000)

	f("time", []logstorage.Field{
		{Name: "foo", Value: "bar"},
		{Name: "time", Value: "2024-06-18T23:37:20.123-05:30"},
	}, 1718773640123000000)

	f("time", []logstorage.Field{
		{Name: "time", Value: "2024-06-18T23:37:20.123456789-05:30"},
		{Name: "foo", Value: "bar"},
	}, 1718773640123456789)
}

func TestExtractTimestampRFC3339NanoFromFields_Error(t *testing.T) {
	f := func(s string) {
		t.Helper()

		fields := []logstorage.Field{
			{Name: "time", Value: s},
		}
		nsecs, err := ExtractTimestampRFC3339NanoFromFields("time", fields)
		if err == nil {
			t.Fatalf("expecting non-nil error")
		}
		if nsecs != 0 {
			t.Fatalf("unexpected nsecs; got %d; want %d", nsecs, 0)
		}
	}

	f("foobar")

	// no Z at the end
	f("2024-06-18T23:37:20")

	// incomplete time
	f("2024-06-18")
	f("2024-06-18T23:37")
}