package tikv

import (
	"errors"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"

	httputil "github.com/pingcap/test-infra/sdk/pkg/util/http"
	"github.com/tidwall/gjson"
)

// Client is a HTTP Client for TiKV.
type Client struct {
	*httputil.Client
	tikvStatusAddr string
}

// NewTiKVClient creates an HTTP Client for TiKV based on TiDBCluster.
func NewTiKVClient(url *url.URL) (*Client, error) {
	return &Client{Client: httputil.NewHTTPClient(http.DefaultClient), tikvStatusAddr: url.String()}, nil
}

func (c *Client) Get(path string) (*http.Response, error) {
	if !strings.HasPrefix(path, "/") {
		return nil, errors.New("path should be prefixed with /")
	}
	u := strings.TrimSuffix(c.tikvStatusAddr, "/") + path
	req, err := http.NewRequest("GET", u, nil)
	if err != nil {
		return nil, err
	}
	return c.Client.Do(req)
}

func (c *Client) GetJsonBytes(path string) ([]byte, error) {
	resp, err := c.Get(path)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("GET request \"%s\", got %v %s", path, resp.StatusCode, string(b))
	}
	if !gjson.ValidBytes(b) {
		return nil, fmt.Errorf("get %s returned invalid JSON bytes.", resp.Request.URL.String())
	}
	return b, nil
}
