package cluster

import (
	corev1 "k8s.io/api/core/v1"
	"k8s.io/utils/pointer"

	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"

	"github.com/tidbcloud/infra-api/pkg/config"
	"github.com/tidbcloud/infra-api/pkg/k8s"
)

func NewDefaultTidbMonitor(namespace string) *v1alpha1.TidbMonitor {
	pullIfNotPresent := corev1.PullIfNotPresent
	// TODO: configuration should be managed in GitOPS
	return &v1alpha1.TidbMonitor{
		Spec: v1alpha1.TidbMonitorSpec{
			Clusters: []v1alpha1.TidbClusterRef{},
			Prometheus: v1alpha1.PrometheusSpec{
				MonitorContainer: v1alpha1.MonitorContainer{
					BaseImage:       config.GetBaseImage(config.PrometheusImage),
					Version:         config.PrometheusVersion,
					ImagePullPolicy: &pullIfNotPresent,
				},
				LogLevel: "info",
				Service: v1alpha1.ServiceSpec{
					Type: corev1.ServiceTypeNodePort,
				},
				Config: &v1alpha1.PrometheusConfiguration{
					ConfigMapRef: &v1alpha1.ConfigMapRef{
						Name:      externalConfigName,
						Namespace: pointer.String(namespace),
					},
				},
				// TODO: should be set --storage.tsdb.retention=2h, but tidbmonitor minimum retention time is 1day
				ReserveDays: 1,
			},
			Grafana: &v1alpha1.GrafanaSpec{
				MonitorContainer: v1alpha1.MonitorContainer{
					BaseImage:       config.GetBaseImage(config.GrafanaImage),
					Version:         config.GrafanaVersion,
					ImagePullPolicy: &pullIfNotPresent,
				},
				LogLevel: "info",
				Service: v1alpha1.ServiceSpec{
					Type: corev1.ServiceTypeNodePort,
				},
				Username: "admin",
				Password: "admin",
				Envs: map[string]string{
					"GF_AUTH_ANONYMOUS_ENABLED":  "true",
					"GF_AUTH_ANONYMOUS_ORG_NAME": "Main Org.",
					"GF_AUTH_ANONYMOUS_ORG_ROLE": "Viewer",
				},
			},
			Reloader: v1alpha1.ReloaderSpec{
				MonitorContainer: v1alpha1.MonitorContainer{
					BaseImage:       config.GetBaseImage(config.TiDBMonitorReloaderImage),
					Version:         config.TiDBMonitorReloaderVersion,
					ImagePullPolicy: &pullIfNotPresent,
				},
				Service: v1alpha1.ServiceSpec{
					Type: corev1.ServiceTypeNodePort,
				},
			},
			Initializer: v1alpha1.InitializerSpec{
				MonitorContainer: v1alpha1.MonitorContainer{
					BaseImage:       config.GetBaseImage(config.TiDBMonitorInitializerImage),
					ImagePullPolicy: &pullIfNotPresent,
				},
				Envs: map[string]string{},
			},
			ImagePullPolicy:   pullIfNotPresent,
			Persistent:        true,
			StorageClassName:  pointer.StringPtr(k8s.DefaultStorageClassName),
			Storage:           "50Gi",
			KubePrometheusURL: pointer.StringPtr("http://prometheus-server.monitor.svc"),
			NodeSelector:      map[string]string{},
			Annotations:       map[string]string{},
			Tolerations:       []corev1.Toleration{},
		},
	}
}
