package dashboards

import (
	"os"
	"testing"

	"github.com/grafana/grafana/pkg/infra/log"
	. "github.com/smartystreets/goconvey/convey"
)

var (
	simpleDashboardConfig = "./testdata/test-configs/dashboards-from-disk"
	oldVersion            = "./testdata/test-configs/version-0"
	brokenConfigs         = "./testdata/test-configs/broken-configs"
)

func TestDashboardsAsConfig(t *testing.T) {
	Convey("Dashboards as configuration", t, func() {
		logger := log.New("test-logger")

		Convey("Can read config file version 1 format", func() {
			_ = os.Setenv("TEST_VAR", "general")
			cfgProvider := configReader{path: simpleDashboardConfig, log: logger}
			cfg, err := cfgProvider.readConfig()
			_ = os.Unsetenv("TEST_VAR")
			So(err, ShouldBeNil)

			validateDashboardAsConfig(t, cfg)
		})

		Convey("Can read config file in version 0 format", func() {
			cfgProvider := configReader{path: oldVersion, log: logger}
			cfg, err := cfgProvider.readConfig()
			So(err, ShouldBeNil)

			validateDashboardAsConfig(t, cfg)
		})

		Convey("Should skip invalid path", func() {

			cfgProvider := configReader{path: "/invalid-directory", log: logger}
			cfg, err := cfgProvider.readConfig()
			if err != nil {
				t.Fatalf("readConfig return an error %v", err)
			}

			So(len(cfg), ShouldEqual, 0)
		})

		Convey("Should skip broken config files", func() {

			cfgProvider := configReader{path: brokenConfigs, log: logger}
			cfg, err := cfgProvider.readConfig()
			if err != nil {
				t.Fatalf("readConfig return an error %v", err)
			}

			So(len(cfg), ShouldEqual, 0)
		})
	})
}
func validateDashboardAsConfig(t *testing.T, cfg []*DashboardsAsConfig) {
	t.Helper()

	So(len(cfg), ShouldEqual, 2)

	ds := cfg[0]
	So(ds.Name, ShouldEqual, "general dashboards")
	So(ds.Type, ShouldEqual, "file")
	So(ds.OrgId, ShouldEqual, 2)
	So(ds.Folder, ShouldEqual, "developers")
	So(ds.FolderUid, ShouldEqual, "xyz")
	So(ds.Editable, ShouldBeTrue)
	So(len(ds.Options), ShouldEqual, 1)
	So(ds.Options["path"], ShouldEqual, "/var/lib/grafana/dashboards")
	So(ds.DisableDeletion, ShouldBeTrue)
	So(ds.UpdateIntervalSeconds, ShouldEqual, 15)

	ds2 := cfg[1]
	So(ds2.Name, ShouldEqual, "default")
	So(ds2.Type, ShouldEqual, "file")
	So(ds2.OrgId, ShouldEqual, 1)
	So(ds2.Folder, ShouldEqual, "")
	So(ds2.FolderUid, ShouldEqual, "")
	So(ds2.Editable, ShouldBeFalse)
	So(len(ds2.Options), ShouldEqual, 1)
	So(ds2.Options["path"], ShouldEqual, "/var/lib/grafana/dashboards")
	So(ds2.DisableDeletion, ShouldBeFalse)
	So(ds2.UpdateIntervalSeconds, ShouldEqual, 10)
}
