package config

import (
	"io/ioutil"
	"os"
	"testing"

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

func TestAPIConfig(t *testing.T) {
	str := `
infraAPI:

# the flowing are just required
server:
  pocManualBackupReservedDays: 1
  pocAutoBackupReservedDays: 2
  onDemandAutoBackupReservedDays: 3
  frontendDNS: aa
  backendDNS: bb
  stage: stage
  centralRoleARN: centralRoleARN
session:
    secret: secret
`

	f, err := ioutil.TempFile("", "config-test*.yaml")
	assert.Nil(t, err)
	defer func() {
		_ = os.Remove(f.Name())
	}()
	_, err = f.WriteString(str)
	assert.Nil(t, err)

	err = InitConfig(f.Name())
	assert.Nil(t, err)
}

func TestHibernationConfig(t *testing.T) {
	str := `
# the flowing are just required
server:
  pocManualBackupReservedDays: 1
  pocAutoBackupReservedDays: 2
  onDemandAutoBackupReservedDays: 3
  frontendDNS: aa
  backendDNS: bb
  stage: stage
  centralRoleARN: centralRoleARN
session:
    secret: secret
`
	f, err := ioutil.TempFile("", "config-test*.yaml")
	assert.Nil(t, err)
	defer func() {
		_ = os.Remove(f.Name())
	}()
	_, err = f.WriteString(str)
	assert.Nil(t, err)

	err = InitConfig(f.Name())
	assert.Nil(t, err)
}

type TestMapIn struct {
	A string
	B string
	C string
}

type TestMap struct {
	Test TestMapIn
}

func TestMergoConfig(t *testing.T) {
	assert := assert.New(t)
	a := TestMap{
		TestMapIn{
			A: "a",
			C: "c1",
		},
	}
	b := TestMap{
		TestMapIn{
			B: "b",
			C: "c2",
		},
	}

	err := mergo.Merge(&a, b, mergo.WithOverride)
	assert.NoError(err)
	assert.Equal(a.Test.B, "b")
	assert.Equal(a.Test.A, "a")
	assert.Equal(a.Test.C, "c2")
}

func TestConfigRemote(t *testing.T) {
	t.Skip("not able test config server in git pr test")
	str := `
infraAPI:

# the flowing are just required
server:
  pocManualBackupReservedDays: 1
  pocAutoBackupReservedDays: 2
  onDemandAutoBackupReservedDays: 3
  frontendDNS: aa
  backendDNS: bb
  stage: stage
  centralRoleARN: centralRoleARN
session:
    secret: secret
`

	f, err := ioutil.TempFile("", "config-test*.yaml")
	assert.Nil(t, err)
	defer func() {
		_ = os.Remove(f.Name())
	}()
	_, err = f.WriteString(str)
	assert.Nil(t, err)

	err = InitConfig(f.Name())
	assert.Nil(t, err)

	assert.True(t, Global().ServerConfig.RemoteConfigEnabled)
}
