package main_test

import (
	"encoding/json"
	"github.com/spf13/viper"
	"pgm/config"
	"pgm/data"
	"pgm/db"
	"pgm/logger"
	"testing"
)


func TestLogs(t *testing.T) {
	t.Parallel()
	var s string
	var want bool = true
	s = "test"
	got := logger.Logger(s)
	if want != got {
		t.Errorf("want %t, got %t", want, got)
	}
}

func TestLoadConfig(t *testing.T) {
	t.Parallel()
	var v *viper.Viper

	var want error = nil
	v, got := config.ReadConfig()
	_ = v
	if want != got {
		t.Error("load config reaturned a non nil error")
	}

}



func TestViperPgmConfig(t *testing.T) {
	t.Parallel()
	testCases := []viperReturnKey{
		{a: "junk", b: "r", want: false, need: ""},
		{a: "test_user", b: "r", want: true, need: "test"},
	}
	for _, tc := range testCases{
		found, got := data.ViperPgmConfig(tc.a, tc.b)
		if tc.want != found{
			t.Errorf("want %t, got %t", tc.want, found)
		}
		if tc.need != got {
			t.Errorf("want %s, got %s", tc.need, got)
		}
	}

}

func TestViperScnConfig(t *testing.T) {
	t.Parallel()
	testCases := []viperScnReturn {
		{t: "test", want: "test"},
		{t: "userSessions", want: "active sessions"},
	}
	for _, tc := range testCases {
		var v *viper.Viper
		v, err := data.ViperScrConfig("scn", map[string]interface{}{})
		if err != nil {
			logger.Logger("[ERROR] scn cfg test error: " + err.Error())
		}
		got := v.GetString(tc.t + ".title")
		if tc.want != got {
			t.Errorf("want %s, got %s", tc.want, got)
		}

	}

}


func TestDbConn(t *testing.T) {
	t.Parallel()
	found, c := data.ViperPgmConfig("test_db", "r")
	testCases := []connTest{
		{connstring: c, want: nil},
	}
	if found != true {
		logger.Logger("[LOG] failed to find test_db in .pgm.yaml")
	}
	for _, tc := range testCases {
		var h data.HostDetails
		err := json.Unmarshal([]byte(tc.connstring), &h)
		if err != nil {
			logger.Logger("[ERROR] db conn test failure: " + err.Error())
		}
		got, err := db.DbConn(h)
		if tc.want != err {
			t.Error("db conn returned an invalid error for test scenario, see logs")
		}
		err = got.Close()
		if err != nil {
			logger.Logger("[ERROR] Unable to close connection during test")
		}

	}



}



type connTest struct {
	connstring string
	want error

}

type viperScnReturn struct {
	t string
	want string
}

type viperReturnKey struct {
	a, b string
	want bool
	need string
}


type initTest struct {
	a, b, c string
	want bool
}