package gce

import (
	"encoding/json"
	"fmt"
	"net/http"
)

func getZonesForProject(client *http.Client, project string) ([]string, error) {
	// See https://cloud.google.com/compute/docs/reference/rest/v1/zones
	zonesURL := fmt.Sprintf("https://compute.googleapis.com/compute/v1/projects/%s/zones", project)
	var zones []string
	pageToken := ""
	for {
		data, err := getAPIResponse(client, zonesURL, "", pageToken)
		if err != nil {
			return nil, fmt.Errorf("cannot obtain zones: %w", err)
		}
		zl, err := parseZoneList(data)
		if err != nil {
			return nil, fmt.Errorf("cannot parse zone list from %q: %w", zonesURL, err)
		}
		for _, z := range zl.Items {
			zones = append(zones, z.Name)
		}
		if len(zl.NextPageToken) == 0 {
			return zones, nil
		}
		pageToken = zl.NextPageToken
	}
}

// ZoneList is response to https://cloud.google.com/compute/docs/reference/rest/v1/zones/list
type ZoneList struct {
	Items         []Zone
	NextPageToken string
}

// Zone is zone from https://cloud.google.com/compute/docs/reference/rest/v1/zones/list
type Zone struct {
	Name string
}

// parseZoneList parses ZoneList from data.
func parseZoneList(data []byte) (*ZoneList, error) {
	var zl ZoneList
	if err := json.Unmarshal(data, &zl); err != nil {
		return nil, fmt.Errorf("cannot unmarshal ZoneList from %q: %w", data, err)
	}
	return &zl, nil
}