package regionalservice

import (
	"context"

	prometheusv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/observability/pkg/common/constants"
	"github.com/tidbcloud/observability/pkg/common/errors"
	"github.com/tidbcloud/observability/pkg/resourcemanager"
	"github.com/tidbcloud/observability/test/mockresourcemanager"
	"go.uber.org/mock/gomock"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	"testing"
)

func TestGetTemplateHandler(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	rw := mockresourcemanager.NewMockPrometheusRuleReaderWriter(ctrl)
	resourcemanager.MockPrometheusRuleReaderWriter(rw)
	resourcemanager.MockVMRuleReaderWriter(rw)
	rw.EXPECT().ListPrometheusRulesInNs(gomock.Any(), constants.RuleTemplateNamespace).Return([]*prometheusv1.PrometheusRule{}, errors.New(errors.UnrecognizedError, "")).Times(1)
	_, err := GetTemplateHandler().ListRuleTemplates(context.TODO())
	assert.Error(t, err)

	rw.EXPECT().ListPrometheusRulesInNs(gomock.Any(), constants.RuleTemplateNamespace).Return([]*prometheusv1.PrometheusRule{
		{
			ObjectMeta: v1.ObjectMeta{
				Name: "test",
			},
		},
	}, nil).Times(1)
	resp, err := GetTemplateHandler().ListRuleTemplates(context.TODO())
	assert.NoError(t, err)
	assert.Equal(t, 1, len(resp.Templates))
	assert.Equal(t, "test", resp.Templates[0].ID)
}

func TestTemplateHandler_GetRuleTemplate(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	rw := mockresourcemanager.NewMockPrometheusRuleReaderWriter(ctrl)
	resourcemanager.MockPrometheusRuleReaderWriter(rw)
	resourcemanager.MockVMRuleReaderWriter(rw)
	rw.EXPECT().GetPrometheusRule(gomock.Any(), "11111").Return(&prometheusv1.PrometheusRule{
		ObjectMeta: v1.ObjectMeta{
			Name: "11111",
		},
		Spec: prometheusv1.PrometheusRuleSpec{
			Groups: []prometheusv1.RuleGroup{
				{
					Name: "group11111",
				},
			},
		},
	}, nil).Times(1)
	rw.EXPECT().GetPrometheusRule(gomock.Any(), "22222").Return(&prometheusv1.PrometheusRule{
		ObjectMeta: v1.ObjectMeta{
			Name: "22222",
		},
		Spec: prometheusv1.PrometheusRuleSpec{
			Groups: []prometheusv1.RuleGroup{
				{
					Name: "group22222",
				},
			},
		},
	}, nil).Times(1)
	rw.EXPECT().GetPrometheusRule(gomock.Any(), "33333").Return(nil, errors.New(errors.PrometheusRuleNotFound, "")).Times(1)

	resp, err := GetTemplateHandler().GetRuleTemplate(context.TODO(), "11111")
	assert.NoError(t, err)
	assert.Equal(t, "group11111", resp.Groups[0].Name)
	resp, err = GetTemplateHandler().GetRuleTemplate(context.TODO(), "22222")
	assert.NoError(t, err)
	assert.Equal(t, "group22222", resp.Groups[0].Name)
	_, err = GetTemplateHandler().GetRuleTemplate(context.TODO(), "33333")
	assert.Error(t, err)

}
