package utils_test

import (
	"fmt"
	"testing"

	"github.com/juju/errors"
	"github.com/sirupsen/logrus"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/auto-deploy/internal/utils"
)

func TestGetRegion(t *testing.T) {
	logrus.SetLevel(logrus.FatalLevel)
	for _, r := range utils.AwsRegions {
		country := r.Country
		if country == "" {
			country, _ = utils.GetAwsRegionCountryCodeViaShell(r.Name)
		}
		fmt.Printf(`{FullName: "%s", Name: "%s", Country: "%s", Area: "%s"},
`, r.FullName, r.Name, country, r.Area)
	}
}

func TestGetRegionName(t *testing.T) {
	region, err := utils.GetAwsRegionName("us-west-2")
	assert.NoError(t, err)
	assert.Equal(t, "Oregon", region)
	region, err = utils.GetAwsRegionName("ap-northeast-1")
	assert.NoError(t, err)
	assert.Equal(t, "Tokyo", region)
}

func TestGetRegionTimeZone(t *testing.T) {
	backup, err := utils.GetAwsRegionBackupTime("ap-northeast-1")
	assert.NoError(t, err)
	assert.Equal(t, "17:00", backup)
}

func TestParseUtcTimeZoneOffset(t *testing.T) {
	offset, err := utils.ParseUtcTimeZoneOffset("utc+8")
	assert.NoError(t, err)
	assert.Equal(t, 8*3600, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc+5:30")
	assert.NoError(t, err)
	assert.Equal(t, 5*3600+30*60, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc-5:30")
	assert.NoError(t, err)
	assert.Equal(t, -5*3600-30*60, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc-0:30")
	assert.NoError(t, err)
	assert.Equal(t, -30*60, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc-6")
	assert.NoError(t, err)
	assert.Equal(t, -6*3600, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc")
	assert.NoError(t, err)
	assert.Equal(t, 0, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc0")
	assert.NoError(t, err)
	assert.Equal(t, 0, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc-0")
	assert.NoError(t, err)
	assert.Equal(t, 0, offset)
	offset, err = utils.ParseUtcTimeZoneOffset("utc8")
	assert.NoError(t, err)
	assert.Equal(t, 8*3600, offset)
	_, err = utils.ParseUtcTimeZoneOffset("utca")
	assert.ErrorAs(t, err, errors.NotValid)
}

func TestConvertTimeZone(t *testing.T) {
	t1, err := utils.GetBackupTimeByTimeZone("utc+10")
	assert.NoError(t, err)
	assert.Equal(t, "16:00", t1)
	t1, err = utils.GetBackupTimeByTimeZone("utc+9")
	assert.NoError(t, err)
	assert.Equal(t, "17:00", t1)
	t1, err = utils.GetBackupTimeByTimeZone("utc+09")
	assert.NoError(t, err)
	assert.Equal(t, "17:00", t1)
	t1, err = utils.GetBackupTimeByTimeZone("utc+09:00")
	assert.NoError(t, err)
	assert.Equal(t, "17:00", t1)
}
