package utils

import (
	"os"
	"testing"

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

func TestGenerateDateRangeAzure(t *testing.T) {
	res := GenerateDateRangeAzure(1724141095)
	assert.Equal(t, "20240801-20240831", res)
}

func TestGenerateDateRangeAWS(t *testing.T) {
	res := GenerateDateRangeAWS(1724141095)
	assert.Equal(t, "20240801-20240901", res)
}

func TestGenerateDailyDate(t *testing.T) {
	res := GenerateDailyDate(1724141095)
	assert.Equal(t, "20240820", res)
}

func TestGenerateBillingDate(t *testing.T) {
	res := GenerateBillingDate(1724141095)
	assert.Equal(t, "08/20/2024", res)
}

func TestEnsureCache(t *testing.T) {
	abspath, err := EnsureCache("cachetest", "test")
	assert.Nil(t, err)
	assert.NotEmpty(t, abspath)
	//test the path exists and is a directory
	info, err := os.Stat(abspath)
	assert.Nil(t, err)
	assert.True(t, info.IsDir())

	// Read the directory contents
	contents, err := os.ReadDir(abspath)
	assert.Nil(t, err)
	assert.Equal(t, 0, len(contents))
	// Remove the directory
	err = os.RemoveAll("cachetest")
	assert.Nil(t, err)
}

func TestGenerateID(t *testing.T) {
	res := GenerateID()
	assert.NotEmpty(t, res)
}

func TestGenerateCheckMonth(t *testing.T) {
	res := GenerateCheckMonth(1724141095)
	assert.Equal(t, "202408", res)
}

func TestGenerateBillingDateForGCP(t *testing.T) {
	res := GenerateBillingDateForGCP(1724141095)
	assert.Equal(t, "2024-08-20", res)
}

func TestIsNumeric(t *testing.T) {
	res := IsNumeric("123")
	assert.True(t, res)
	res = IsNumeric("123.45")
	assert.False(t, res)
	res = IsNumeric("abc")
	assert.False(t, res)
}

func TestGenerateHourDimension(t *testing.T) {
	res := GenerateHourDimension(1724141095)
	assert.Equal(t, "2024082008", res)
}

func TestGenerateHourDimensionWithOffset(t *testing.T) {
	// Base timestamp: 1724141095 = 2024-08-20 08:xx:xx UTC
	baseTimestamp := int64(1724141095)

	// Test 0 day offset (should be same as GenerateHourDimension)
	res := GenerateHourDimensionWithOffset(baseTimestamp, 0)
	assert.Equal(t, "2024082008", res)

	// Test -1 day offset (one day before)
	res = GenerateHourDimensionWithOffset(baseTimestamp, -1)
	assert.Equal(t, "2024081908", res)

	// Test -30 day offset (30 days before)
	res = GenerateHourDimensionWithOffset(baseTimestamp, -30)
	assert.Equal(t, "2024072108", res)

	// Test +1 day offset (one day after)
	res = GenerateHourDimensionWithOffset(baseTimestamp, 1)
	assert.Equal(t, "2024082108", res)

	// Test +30 day offset (30 days after)
	res = GenerateHourDimensionWithOffset(baseTimestamp, 30)
	assert.Equal(t, "2024091908", res)
}
