// SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
//
// SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0

package tests

import (
	"context"
	"testing"
	"time"

	"github.com/onosproject/helmit/pkg/helm"
	"github.com/onosproject/helmit/pkg/input"
	"github.com/onosproject/helmit/pkg/kubernetes"
	"github.com/onosproject/helmit/pkg/test"
	"github.com/onosproject/onos-test/pkg/onostest"
	"github.com/stretchr/testify/assert"
)

const aetherCharts = "https://charts.aetherproject.org/"

// AetherRocUmbrellaSuite is the aether-roc-umbrella chart test suite
type AetherRocUmbrellaSuite struct {
	test.Suite
	c *input.Context
}

// SetupTestSuite sets up the aether roc umbrella test suite
func (s *AetherRocUmbrellaSuite) SetupTestSuite(c *input.Context) error {
	s.c = c
	return nil
}

func getCredentials() (string, string, error) {
	kubClient, err := kubernetes.New()
	if err != nil {
		return "", "", err
	}
	secrets, err := kubClient.CoreV1().Secrets().Get(context.Background(), onostest.SecretsName)
	if err != nil {
		return "", "", err
	}
	username := string(secrets.Object.Data["sd-ran-username"])
	password := string(secrets.Object.Data["sd-ran-password"])

	return username, password, nil
}

// TestInstall tests installing the aether-roc-umbrella chart
func (s *AetherRocUmbrellaSuite) TestInstall(t *testing.T) {
	username, password, err := getCredentials()
	assert.NoError(t, err)
	registry := s.c.GetArg("registry").String("")

	onos := helm.Chart("aether-roc-umbrella", aetherCharts).
		Release("aether-roc-umbrella").
		SetUsername(username).
		SetPassword(password).
		WithTimeout(15*time.Minute).
		Set("import.onos-gui.enabled", false).
		Set("import.aether-roc-gui.v3.enabled", false).
		Set("import.aether-roc-gui.v4.enabled", true).
		Set("import.onos-cli.enabled", false).
		Set("import.prometheus.acc.enabled", false).
		Set("aether-roc-gui-v4.prometheus.acc.proxyEnabled", false).
		Set("import.prometheus.amp.enabled", false).
		Set("aether-roc-gui-v4.prometheus.amp.proxyEnabled", false).
		Set("import.prometheus.ace.enabled", false).
		Set("aether-roc-gui-v4.prometheus.site", nil).
		Set("import.grafana.enabled", false).
		Set("aether-roc-gui-v4.grafana.enabled", false).
		Set("aether-roc-gui-v4.grafana.proxyEnabled", false).
		Set("aether-roc-gui-v4.service.type", "NodePort").
		Set("onos-config.plugin.compiler.target", "github.com/onosproject/onos-config@master").
		Set("global.image.registry", registry)
	assert.NoError(t, onos.Install(true))
}
