package regionalservercli

import (
	"context"
	"net/url"

	grpc "google.golang.org/grpc"

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

type VpcServiceHTTPClient struct {
	*baseServiceHTTPClient
}

func NewVpcServiceHTTPClient(endpoint string) *VpcServiceHTTPClient {
	return &VpcServiceHTTPClient{
		baseServiceHTTPClient: newBaseServiceHTTPClient(endpoint),
	}
}

func (c *VpcServiceHTTPClient) ListVpcs(ctx context.Context, in *regionalpb.ListVpcsRequest, opts ...grpc.CallOption) (*regionalpb.ListVpcsResponse, error) {
	query := make(url.Values)
	if in.GetTenantId() != "" {
		query.Add("tenantId", in.GetTenantId())
	}
	if in.GetProjectId() != "" {
		query.Add("projectId", in.GetProjectId())
	}
	if in.GetClusterId() != "" {
		query.Add("clusterId", in.GetClusterId())
	}
	url := c.buildRequestURL("/vpcs?%s", query.Encode())
	data, err := c.doHttpGetRequest(ctx, url)
	if err != nil {
		return nil, err
	}
	out := new(regionalpb.ListVpcsResponse)
	if err := c.unmarshalOpt.Unmarshal(data, out); err != nil {
		return nil, err
	}
	return out, nil
}

func (c *VpcServiceHTTPClient) QueryVpcClusterIds(ctx context.Context, in *regionalpb.QueryVpcClusterIdsRequest, opts ...grpc.CallOption) (*regionalpb.QueryVpcClusterIdsResponse, error) {
	query := make(url.Values)
	if in.GetTenantId() != "" {
		query.Add("tenantId", in.GetTenantId())
	}
	if in.GetProjectId() != "" {
		query.Add("projectId", in.GetProjectId())
	}
	if info := in.GetAws(); info != nil {
		query.Add("aws.vpcId", info.GetVpcId())
		query.Add("aws.accountId", info.GetAccountId())
	} else if info := in.GetGcp(); info != nil {
		query.Add("gcp.networkName", info.GetNetworkName())
		query.Add("gcp.projectId", info.GetProjectId())
	}

	url := c.buildRequestURL("/vpcs/queryVpcClusterIds?%s", query.Encode())
	data, err := c.doHttpGetRequest(ctx, url)
	if err != nil {
		return nil, err
	}
	out := new(regionalpb.QueryVpcClusterIdsResponse)
	if err := c.unmarshalOpt.Unmarshal(data, out); err != nil {
		return nil, err
	}
	return out, nil
}

func (c *VpcServiceHTTPClient) GetVpc(ctx context.Context, in *regionalpb.GetVpcRequest, opts ...grpc.CallOption) (*regionalpb.Vpc, error) {
	url := c.buildRequestURL("/vpcs/%s", in.GetVpcId())
	data, err := c.doHttpGetRequest(ctx, url)
	if err != nil {
		return nil, err
	}
	out := new(regionalpb.Vpc)
	if err := c.unmarshalOpt.Unmarshal(data, out); err != nil {
		return nil, err
	}
	return out, nil
}
