package gpaste_test

import (
	"os"
	"strings"
	"testing"

	"git.t-juice.club/torjus/gpaste"
	"github.com/google/go-cmp/cmp"
)

func TestServerConfig(t *testing.T) {
	t.Run("FromReader", func(t *testing.T) {
		clearEnv()
		simpleConfig := `
LogLevel = "INFO"
URL = "http://paste.example.org"
ListenAddr = ":8080"
SigningSecret = "abc999"

[Store]
Type = "fs"
[Store.FS]
Dir = "/tmp"
`
		expected := &gpaste.ServerConfig{
			LogLevel:      "INFO",
			URL:           "http://paste.example.org",
			ListenAddr:    ":8080",
			SigningSecret: "abc999",
			Store: &gpaste.ServerStoreConfig{
				Type: "fs",
				FS: &gpaste.ServerStoreFSStoreConfig{
					Dir: "/tmp",
				},
			},
		}
		sr := strings.NewReader(simpleConfig)

		c, err := gpaste.ServerConfigFromReader(sr)
		if err != nil {
			t.Fatalf("Error parsing config: %s", err)
		}

		if !cmp.Equal(c, expected) {
			t.Errorf("Result does not match: %s", cmp.Diff(c, expected))
		}
	})
	t.Run("FromEnv", func(t *testing.T) {
		clearEnv()

		var envMap map[string]string = map[string]string{
			"GPASTE_LOGLEVEL":      "DEBUG",
			"GPASTE_URL":           "http://gpaste.example.org",
			"GPASTE_STORE_TYPE":    "fs",
			"GPASTE_LISTENADDR":    ":8000",
			"GPASTE_SIGNINGSECRET": "test1345",
			"GPASTE_STORE_FS_DIR":  "/tmp",
		}
		expected := &gpaste.ServerConfig{
			LogLevel:      "DEBUG",
			URL:           "http://gpaste.example.org",
			ListenAddr:    ":8000",
			SigningSecret: "test1345",
			Store: &gpaste.ServerStoreConfig{
				Type: "fs",
				FS: &gpaste.ServerStoreFSStoreConfig{
					Dir: "/tmp",
				},
			},
		}

		for k, v := range envMap {
			os.Setenv(k, v)
		}

		sr := strings.NewReader("")
		c, err := gpaste.ServerConfigFromReader(sr)
		if err != nil {
			t.Fatalf("Error parsing empty config")
		}

		if !cmp.Equal(c, expected) {
			t.Errorf("Result does not match: %s", cmp.Diff(c, expected))
		}
	})
}

func clearEnv() {
	for _, env := range os.Environ() {
		result := strings.Split(env, "=")
		value := result[0]
		if strings.Contains(value, "GPASTE_") {
			os.Unsetenv(value)
		}
	}
}