package digitalocean

import (
	"context"
	"fmt"
	"os"
	"testing"

	"github.com/digitalocean/godo"
	builderT "github.com/hashicorp/packer/helper/builder/testing"
	"golang.org/x/oauth2"
)

func TestBuilderAcc_basic(t *testing.T) {
	builderT.Test(t, builderT.TestCase{
		PreCheck: func() { testAccPreCheck(t) },
		Builder:  &Builder{},
		Template: fmt.Sprintf(testBuilderAccBasic, "ubuntu-20-04-x64"),
	})
}

func TestBuilderAcc_imageId(t *testing.T) {
	builderT.Test(t, builderT.TestCase{
		PreCheck: func() { testAccPreCheck(t) },
		Builder:  &Builder{},
		Template: makeTemplateWithImageId(t),
	})
}

func testAccPreCheck(t *testing.T) {
	if v := os.Getenv("DIGITALOCEAN_API_TOKEN"); v == "" {
		t.Fatal("DIGITALOCEAN_API_TOKEN must be set for acceptance tests")
	}
}

func makeTemplateWithImageId(t *testing.T) string {
	if os.Getenv(builderT.TestEnvVar) != "" {
		token := os.Getenv("DIGITALOCEAN_API_TOKEN")
		client := godo.NewClient(oauth2.NewClient(context.TODO(), &apiTokenSource{
			AccessToken: token,
		}))
		image, _, err := client.Images.GetBySlug(context.TODO(), "ubuntu-20-04-x64")
		if err != nil {
			t.Fatalf("failed to retrieve image ID: %s", err)
		}

		return fmt.Sprintf(testBuilderAccBasic, image.ID)
	}

	return ""
}

const testBuilderAccBasic = `
{
	"builders": [{
		"type": "test",
		"region": "nyc2",
		"size": "s-1vcpu-1gb",
		"image": "%v",
		"ssh_username": "root",
		"user_data": "",
		"user_data_file": ""
	}]
}
`
