package tepserver

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/pingcap/tep/pkg/utils"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

func (s *Server) APIServerReverseProxy(ctx *gin.Context) {
	s.reserveProxy.ServeHTTP(ctx.Writer, ctx.Request)
}

func (s *Server) director(req *http.Request) {
	uri := strings.TrimPrefix(req.URL.String(), s.APIPrefix)
	u, _ := url.Parse(s.getAPIServerURL(s.APIServerPrefix + uri))
	req.URL = u
}

func (s *Server) APIServerGetURI(uri string) ([]byte, utils.APIStatus) {
	c := s.newAPIServerClient(uri)

	resp, err := c.Get()
	if err != nil {
		return nil, utils.NewAPIStatus(utils.ParseHTTPError(err), err.Error())
	}
	defer resp.Body.Close()

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

	return bodyBytes, utils.NewAPIStatus(resp.StatusCode, resp.Status)
}

func (s *Server) newAPIServerClient(uri string) *utils.HTTPClient {
	url := s.getAPIServerURL(s.APIServerPrefix + uri)

	return utils.NewHTTPClient(url, s.TLSConfig)
}

func (s *Server) SetURL(httpClient *utils.HTTPClient, uri string) {
	url := s.getAPIServerURL(s.APIServerPrefix + uri)
	httpClient.SetURL(url)
	return
}

func (s *Server) getAPIServerURL(uri string) string {
	return fmt.Sprintf("https://%s:%d%s", s.KubeAPIServerHost, s.KubeAPIServerPort, uri)
}

func (s *Server) getAPIServerFullURL(path string) string {
	uri := fmt.Sprintf("%s%s", s.APIServerPrefix, path)
	return s.getAPIServerURL(uri)
}
