package test

import (
	"testing"

	"github.com/stretchr/testify/assert"
	cfg "scm.yoorie.de/go-lib/micro/config"
)

type MyConfig struct {
	Value  string `default:"Bar" yaml:"value"`
	Value1 bool   `default:"false" yaml:"value1"`
	Value2 int    `default:"8080" yaml:"value2"`
}

func (config *MyConfig) appName() string {
	return "myconfig"
}

func TestIsStructPointerStruct(t *testing.T) {
	assert.False(t, cfg.IsStructPointer(MyConfig{}))
}
func TestIsStructPointerString(t *testing.T) {
	assert.False(t, cfg.IsStructPointer("Bar"))
}

func TestIsStructPointerSimpleArray(t *testing.T) {
	assert.False(t, cfg.IsStructPointer([2]int{292, 2}))
}

func TestIsStructPointerInt(t *testing.T) {
	assert.False(t, cfg.IsStructPointer(12))
}

func TestIsStructPointerBool(t *testing.T) {
	assert.False(t, cfg.IsStructPointer(false))
}

func TestIsStructPointerStructPointer(t *testing.T) {
	assert.True(t, cfg.IsStructPointer(&MyConfig{}))
}

func TestIsStructPointerStructPointerArray(t *testing.T) {
	cfg1 := &MyConfig{
		Value: "Foo",
	}
	cfg2 := &MyConfig{
		Value: "Bar",
	}
	array := [2]*MyConfig{cfg1, cfg2}
	assert.False(t, cfg.IsStructPointer(array))
}

func TestLoadConfigurationFromFileWithNoPointerInvalidType(t *testing.T) {
	myConfig := MyConfig{}
	err := cfg.LoadConfigurationFromFile(myConfig, "testdata/config.yml")
	assert.NotNil(t, err)
}

func TestLoadConfigurationFromFile(t *testing.T) {
	myConfig := &MyConfig{}
	assert.Equal(t, "myconfig", myConfig.appName())
	cfg.LoadConfigurationFromFile(myConfig, "testdata/config.yml")
	assert.Equal(t, "Foo", myConfig.Value)
	assert.Equal(t, true, myConfig.Value1)
	assert.Equal(t, 8080, myConfig.Value2)
}
func TestLoadConfigurationFromFileNotExist(t *testing.T) {
	myConfig := &MyConfig{}
	assert.Equal(t, "myconfig", myConfig.appName())
	err := cfg.LoadConfigurationFromFile(myConfig, "testdata/config1.yml")
	assert.NotNil(t, err)
}

func TestGetConfigurationFiles(t *testing.T) {
	fileNames := cfg.GetConfigurationFiles("myapp")
	assert.Equal(t, 4, len(fileNames))

	for _, fileName := range fileNames {
		t.Log(fileName)
	}
}