package regionalservercli

import (
	"context"
	"net/url"

	grpc "google.golang.org/grpc"

	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
)

type ClusterServiceHTTPClient struct {
	*baseServiceHTTPClient
}

func NewClusterServiceHTTPClient(endpoint string) *ClusterServiceHTTPClient {
	return &ClusterServiceHTTPClient{
		baseServiceHTTPClient: newBaseServiceHTTPClient(endpoint),
	}
}

func (c *ClusterServiceHTTPClient) ListClusters(ctx context.Context, in *regionalpb.ListClustersRequest, opts ...grpc.CallOption) (out *regionalpb.ListClustersResponse, err error) {
	query := make(url.Values)
	if in.GetTenantId() != "" {
		query.Add("tenantId", in.GetTenantId())
	}
	for _, id := range in.GetProjectIds() {
		query.Add("projectId", id)
	}
	url := c.buildRequestURL("/clusters?%s", query.Encode())
	data, err := c.doHttpGetRequest(ctx, url)
	if err != nil {
		return nil, err
	}
	out = new(regionalpb.ListClustersResponse)
	if err := c.unmarshalOpt.Unmarshal(data, out); err != nil {
		return nil, err
	}
	return out, nil
}

func (c *ClusterServiceHTTPClient) GetCluster(ctx context.Context, in *regionalpb.GetClusterRequest, opts ...grpc.CallOption) (*regionalpb.Cluster, error) {
	url := c.buildRequestURL("/clusters/%s", in.GetClusterId())
	data, err := c.doHttpGetRequest(ctx, url)
	if err != nil {
		return nil, err
	}
	out := new(regionalpb.Cluster)
	if err := c.unmarshalOpt.Unmarshal(data, out); err != nil {
		return nil, err
	}
	return out, nil
}

func (c *ClusterServiceHTTPClient) GetClusterRole(ctx context.Context, in *regionalpb.GetClusterRoleRequest, opts ...grpc.CallOption) (*regionalpb.ClusterRole, error) {
	url := c.buildRequestURL("/clusters/%s:getClusterRole", in.GetClusterId())
	data, err := c.doHttpGetRequest(ctx, url)
	if err != nil {
		return nil, err
	}
	out := new(regionalpb.ClusterRole)
	if err := c.unmarshalOpt.Unmarshal(data, out); err != nil {
		return nil, err
	}
	return out, nil
}
