package tz_test

import (
	"os"
	"runtime"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"github.com/coder/coder/v2/coderd/util/tz"
)

//nolint:paralleltest // Environment variables
func Test_TimezoneIANA(t *testing.T) {
	//nolint:paralleltest // t.Setenv
	t.Run("Env", func(t *testing.T) {
		t.Setenv("TZ", "Europe/Dublin")

		zone, err := tz.TimezoneIANA()
		assert.NoError(t, err)
		if assert.NotNil(t, zone) {
			assert.Equal(t, "Europe/Dublin", zone.String())
		}
	})

	//nolint:paralleltest // UnsetEnv
	t.Run("NoEnv", func(t *testing.T) {
		_, err := os.Stat("/etc/localtime")
		if runtime.GOOS == "linux" && err != nil {
			// Not all Linux operating systems are guaranteed to have localtime!
			t.Skip("localtime doesn't exist!")
		}
		if runtime.GOOS == "windows" {
			// This test can be flaky on some Windows runners :(
			t.Skip("This test is flaky under Windows.")
		}
		oldEnv, found := os.LookupEnv("TZ")
		if found {
			require.NoError(t, os.Unsetenv("TZ"))
			t.Cleanup(func() {
				_ = os.Setenv("TZ", oldEnv)
			})
		}

		zone, err := tz.TimezoneIANA()
		assert.NoError(t, err)
		assert.NotNil(t, zone)
	})
}
