package controller

import (
	"fmt"
	"strings"

	"github.com/pingcap/tidb-operator/pkg/label"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/version"
)

const (
	TiDBOperatorNamespace = "tidb-admin"
)

func (c *Controller) GetKubernetesServerVersion() (*version.Info, error) {
	return c.kubeCli.Discovery().ServerVersion()
}

func (c *Controller) GetTiDBOperatorVersion() (string, error) {
	listOptions := metav1.ListOptions{LabelSelector: fmt.Sprintf("%s=%s,%s=%s", label.ComponentLabelKey, "controller-manager", label.NameLabelKey, "tidb-operator")}
	controllers, err := c.kubeCli.AppsV1().Deployments(TiDBOperatorNamespace).List(listOptions)
	if err != nil {
		return "", err
	}

	if len(controllers.Items) == 1 {
		return c.GetImageVersion(controllers.Items[0].Spec.Template.Spec.Containers[0].Image), nil
	} else if len(controllers.Items) == 0 {
		return "", fmt.Errorf("controller-manager deployment not found in namespace[%s]", TiDBOperatorNamespace)
	} else {
		return "", fmt.Errorf("%d controller-manager deployment found in namespace[%s]", len(controllers.Items), TiDBOperatorNamespace)
	}
}

func (c *Controller) GetImageVersion(image string) string {
	s := strings.Split(image, ":")
	if len(s) == 2 {
		return s[1]
	}
	return ""
}
