package main

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/pingcap/schrodinger/pkg/test_client"
	"io"
	"net/http"
)

const memberUrlTemplate = "http://%s/pd/api/v1/members"

func PdNames(pdAddr string) []string {
	request, err := http.NewRequest(http.MethodGet,
		fmt.Sprintf(memberUrlTemplate, pdAddr), nil)
	if err != nil {
		client.Fatal("[tibug-53] req construct fail")
	}

	response, err := hclient.Do(request)
	if err != nil {
		client.Fatalf("[tibug-53] can not get pd members info from %s, %v\n", pdAddr, err)
	}
	if response.StatusCode != 200 {
		client.Fatalf("[tibug-53] pd response status code %d\n", response.StatusCode)
	}

	return allNames(response.Body)
}

func allNames(reader io.Reader) []string {
	jsonVal := make(map[string]interface{})
	decoder := json.NewDecoder(reader)
	err := decoder.Decode(&jsonVal)
	jsonMarshalFatal(err)

	pdInfosInterface, ok := jsonVal["members"]
	if !ok {
		jsonMarshalFatal(errors.New("members field not exist"))
	}

	pdInfos, ok := pdInfosInterface.([]interface{})
	if !ok {
		jsonMarshalFatal(errors.New("members field not an array"))
	}

	res := make([]string, len(pdInfos))

	for i, pdInfo := range pdInfos {
		infoMap, ok := pdInfo.(map[string]interface{})
		if !ok {
			jsonMarshalFatal(errors.New("pd info format error"))
		}

		res[i], ok = infoMap["name"].(string)
		if !ok {
			jsonMarshalFatal(errors.New("pd info do not have name field"))
		}
	}

	return res
}

func jsonMarshalFatal(err error) {
	if err != nil {
		client.Fatal("[tibug-53] json marshal fail")
	}
}
