package tepserver

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"

	"github.com/pingcap/tep/pkg/apis/apiserver/v1alpha1"
	"github.com/pingcap/tep/pkg/apis/tepserver/types"
	"github.com/pingcap/tep/pkg/utils"
	"github.com/pingcap/tep/pkg/version"
)

func (s *Server) GetVersion() (*types.GetVersionResponse, utils.APIStatus) {
	var err error
	var c *utils.HTTPClient
	var resp *http.Response
	var body []byte
	var platformVersions v1alpha1.PlatformOverview

	c = s.newAPIServerClient("/platform/basic-information")
	if resp, err = c.Get(); err != nil {
		return nil, utils.NewAPIStatus(utils.ParseHTTPError(err),
			fmt.Sprintf("failed to get version, err: %v", err.Error()))
	}
	defer resp.Body.Close()

	if body, err = ioutil.ReadAll(resp.Body); err != nil {
		return nil, utils.NewAPIStatus(http.StatusInternalServerError, err.Error())
	}

	if err = json.Unmarshal(body, &platformVersions); err != nil {
		return nil, utils.NewAPIStatus(http.StatusInternalServerError,
			fmt.Sprintf("unable to decode response %v to map", resp))
	}

	res := types.GetVersionResponse{
		APIVersion:          v1alpha1.SchemeGroupVersion.String(),
		Kind:                "Version",
		GitBranch:           version.TEPGitBranch,
		GitHash:             version.TEPGitHash,
		ReleaseVersion:      version.TEPReleaseVersion,
		UtcBuildTime:        version.TEPBuildTS,
		KubernetesVersion:   platformVersions.KubernetesVersion,
		MetaDBVersion:       platformVersions.MetaDBVersion,
		TidbOperatorVersion: platformVersions.TiDBOperatorVersion,
	}
	return &res, utils.NewAPIStatus(resp.StatusCode, resp.Status)
}
