package digitalocean

import (
	"reflect"
	"testing"
)

func TestParseAPIResponse(t *testing.T) {
	f := func(data string, responseExpected *listDropletResponse) {
		t.Helper()

		response, err := parseAPIResponse([]byte(data))
		if err != nil {
			t.Fatalf("unexpected parseAPIResponse() error: %s", err)
		}
		if !reflect.DeepEqual(response, responseExpected) {
			t.Fatalf("unexpected response\ngot\n%v\nwant\n%v", response, responseExpected)
		}
	}

	data := `
{
  "droplets": [
    {
      "id": 3164444,
      "name": "example.com",
      "memory": 1024,
      "vcpus": 1,
      "status": "active",
      "kernel": {
        "id": 2233,
        "name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic",
        "version": "3.13.0-37-generic"
      },
      "features": [
        "backups",
        "ipv6",
        "virtio"
      ],
      "snapshot_ids": [],
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64",
        "public": true,
        "regions": [
          "nyc1"
        ]
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.236.32.182",
            "netmask": "255.255.192.0",
            "gateway": "104.236.0.1",
            "type": "public"
          }
        ],
        "v6": [
          {
            "ip_address": "2604:A880:0800:0010:0000:0000:02DD:4001",
            "netmask": 64,
            "gateway": "2604:A880:0800:0010:0000:0000:0000:0001",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3",
        "features": [
          "private_networking",
          "backups",
          "ipv6"
        ]
      },
      "tags": [
        "tag1",
        "tag2"
      ],
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    }
  ],
  "links": {
    "pages": {
      "last": "https://api.digitalocean.com/v2/droplets?page=3&per_page=1",
      "next": "https://api.digitalocean.com/v2/droplets?page=2&per_page=1"
    }
  }
}`

	responseExpected := &listDropletResponse{
		Droplets: []droplet{
			{
				Image: dropletImage{
					Name: "14.04 x64",
					Slug: "ubuntu-16-04-x64",
				},
				Region: dropletRegion{
					Slug: "nyc3",
				},
				Networks: networks{
					V6: []network{
						{
							IPAddress: "2604:A880:0800:0010:0000:0000:02DD:4001",
							Type:      "public",
						},
					},
					V4: []network{
						{
							IPAddress: "104.236.32.182",
							Type:      "public",
						},
					},
				},
				SizeSlug: "s-1vcpu-1gb",
				Features: []string{"backups", "ipv6", "virtio"},
				Tags:     []string{"tag1", "tag2"},
				Status:   "active",
				Name:     "example.com",
				ID:       3164444,
				VpcUUID:  "f9b0769c-e118-42fb-a0c4-fed15ef69662",
			},
		},
		Links: links{
			Pages: linksPages{
				Last: "https://api.digitalocean.com/v2/droplets?page=3&per_page=1",
				Next: "https://api.digitalocean.com/v2/droplets?page=2&per_page=1",
			},
		},
	}
	f(data, responseExpected)
}

func TestGetDroplets(t *testing.T) {
	f := func(getAPIResponse func(string) ([]byte, error), expectedDropletCount int) {
		t.Helper()

		resp, err := getDroplets(getAPIResponse)
		if err != nil {
			t.Fatalf("getDroplets() error: %s", err)
		}
		if len(resp) != expectedDropletCount {
			t.Fatalf("unexpected droplets count; got %d; want %d\ndroplets:\n%v", len(resp), expectedDropletCount, resp)
		}
	}

	getAPIResponse := func(s string) ([]byte, error) {
		var resp []byte
		switch s {
		case dropletsAPIPath:
			// return next
			resp = []byte(`{ "droplets": [
    {
      "id": 3164444,
      "name": "example.com",
      "status": "active",
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64",
        "public": true,
        "regions": [
          "nyc1"
        ]
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.236.32.182",
            "netmask": "255.255.192.0",
            "gateway": "104.236.0.1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3"
      },
      "tags": [
        "tag1",
        "tag2"
      ],
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    },
    {
      "id": 3164444,
      "name": "example.com",
      "status": "active",
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64"
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.236.32.183",
            "netmask": "255.255.192.0",
            "gateway": "104.236.0.1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3"
      },
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    },
    {
      "id": 3164444,
      "name": "example.com",
      "status": "active",
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64"
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.236.32.183",
            "netmask": "255.255.192.0",
            "gateway": "104.236.0.1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3"
      },
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    }
  ],
  "links": {
    "pages": {
      "last": "https://api.digitalocean.com/v2/droplets?page=3&per_page=1",
      "next": "https://api.digitalocean.com/v2/droplets?page=2&per_page=1"
    }
  }
}`)
		default:
			// return with empty next
			resp = []byte(`{ "droplets": [
    {
      "id": 3164444,
      "name": "example.com",
      "status": "active",
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64"
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.236.32.183",
            "netmask": "255.255.192.0",
            "gateway": "104.236.0.1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3"
      },
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    },
    {
      "id": 3164444,
      "name": "example.com",
      "status": "active",
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64"
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.236.32.183",
            "netmask": "255.255.192.0",
            "gateway": "104.236.0.1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3"
      },
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    }
  ]
}`)
		}
		return resp, nil
	}
	f(getAPIResponse, 5)
}