// Copyright The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package digitalocean

import (
	"fmt"
	"net/http"
	"net/http/httptest"
	"strconv"
	"testing"
)

// SDMock is the interface for the DigitalOcean mock.
type SDMock struct {
	t      *testing.T
	Server *httptest.Server
	Mux    *http.ServeMux
}

// NewSDMock returns a new SDMock.
func NewSDMock(t *testing.T) *SDMock {
	return &SDMock{
		t: t,
	}
}

// Endpoint returns the URI to the mock server.
func (m *SDMock) Endpoint() string {
	return m.Server.URL + "/"
}

// Setup creates the mock server.
func (m *SDMock) Setup() {
	m.Mux = http.NewServeMux()
	m.Server = httptest.NewServer(m.Mux)
}

// ShutdownServer creates the mock server.
func (m *SDMock) ShutdownServer() {
	m.Server.Close()
}

const tokenID = "3c9a75a2-24fd-4508-b4f2-11f18aa97411"

// HandleDropletsList mocks droplet list.
func (m *SDMock) HandleDropletsList() {
	m.Mux.HandleFunc("/v2/droplets", func(w http.ResponseWriter, r *http.Request) {
		if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", tokenID) {
			w.WriteHeader(http.StatusForbidden)
			return
		}

		w.Header().Add("content-type", "application/json; charset=utf-8")
		w.Header().Add("ratelimit-limit", "1200")
		w.Header().Add("ratelimit-remaining", "965")
		w.Header().Add("ratelimit-reset", "1415984218")
		w.WriteHeader(http.StatusAccepted)

		page := 1
		if pageQuery, ok := r.URL.Query()["page"]; ok {
			var err error
			page, err = strconv.Atoi(pageQuery[0])
			if err != nil {
				panic(err)
			}
		}
		fmt.Fprint(w, []string{
			`
{
  "droplets": [
    {
      "id": 3164444,
      "name": "example.com",
      "memory": 1024,
      "vcpus": 1,
      "disk": 25,
      "locked": false,
      "status": "active",
      "kernel": {
        "id": 2233,
        "name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic",
        "version": "3.13.0-37-generic"
      },
      "created_at": "2014-11-14T16:29:21Z",
      "features": [
        "backups",
        "ipv6",
        "virtio"
      ],
      "backup_ids": [
        7938002
      ],
      "snapshot_ids": [

      ],
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64",
        "public": true,
        "regions": [
          "nyc1",
          "ams1",
          "sfo1",
          "nyc2",
          "ams2",
          "sgp1",
          "lon1",
          "nyc3",
          "ams3",
          "nyc3"
        ],
        "created_at": "2014-10-17T20:24:33Z",
        "type": "snapshot",
        "min_disk_size": 20,
        "size_gigabytes": 2.34
      },
      "volume_ids": [

      ],
      "size": {
      },
      "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",
        "sizes": [

        ],
        "features": [
          "virtio",
          "private_networking",
          "backups",
          "ipv6",
          "metadata"
        ],
        "available": null
      },
      "tags": [

      ],
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    },
    {
      "id": 3164494,
      "name": "prometheus",
      "memory": 1024,
      "vcpus": 1,
      "disk": 25,
      "locked": false,
      "status": "active",
      "kernel": {
        "id": 2233,
        "name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic",
        "version": "3.13.0-37-generic"
      },
      "created_at": "2014-11-14T16:36:31Z",
      "features": [
        "virtio"
      ],
      "backup_ids": [

      ],
      "snapshot_ids": [
        7938206
      ],
      "image": {
        "id": 6918990,
        "name": "14.04 x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-16-04-x64",
        "public": true,
        "regions": [
          "nyc1",
          "ams1",
          "sfo1",
          "nyc2",
          "ams2",
          "sgp1",
          "lon1",
          "nyc3",
          "ams3",
          "nyc3"
        ],
        "created_at": "2014-10-17T20:24:33Z",
        "type": "snapshot",
        "min_disk_size": 20,
        "size_gigabytes": 2.34
      },
      "volume_ids": [

      ],
      "size": {
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "104.131.186.241",
            "netmask": "255.255.240.0",
            "gateway": "104.131.176.1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "New York 3",
        "slug": "nyc3",
        "sizes": [
          "s-1vcpu-1gb",
          "s-1vcpu-2gb",
          "s-1vcpu-3gb",
          "s-2vcpu-2gb",
          "s-3vcpu-1gb",
          "s-2vcpu-4gb",
          "s-4vcpu-8gb",
          "s-6vcpu-16gb",
          "s-8vcpu-32gb",
          "s-12vcpu-48gb",
          "s-16vcpu-64gb",
          "s-20vcpu-96gb",
          "s-24vcpu-128gb",
          "s-32vcpu-192gb"
        ],
        "features": [
          "virtio",
          "private_networking",
          "backups",
          "ipv6",
          "metadata"
        ],
        "available": true
      },
      "tags": [
        "monitor"
      ],
      "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662"
    }
  ],
  "links": {
    "pages": {
      "next": "https://api.digitalocean.com/v2/droplets?page=2&per_page=2",
      "last": "https://api.digitalocean.com/v2/droplets?page=2&per_page=2"
    }
  },
  "meta": {
    "total": 4
  }
}
	`,
			`
{
  "droplets": [
    {
      "id": 175072239,
      "name": "prometheus-demo-old",
      "memory": 1024,
      "vcpus": 1,
      "disk": 25,
      "locked": false,
      "status": "off",
      "kernel": null,
      "created_at": "2020-01-10T16:47:39Z",
      "features": [
        "ipv6",
        "private_networking"
      ],
      "backup_ids": [],
      "next_backup_window": null,
      "snapshot_ids": [],
      "image": {
        "id": 53893572,
        "name": "18.04.3 (LTS) x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-18-04-x64",
        "public": true,
        "regions": [
          "nyc3",
          "nyc1",
          "sfo1",
          "nyc2",
          "ams2",
          "sgp1",
          "lon1",
          "nyc3",
          "ams3",
          "fra1",
          "tor1",
          "sfo2",
          "blr1",
          "sfo3"
        ],
        "created_at": "2019-10-22T01:38:19Z",
        "min_disk_size": 20,
        "type": "base",
        "size_gigabytes": 2.36,
        "description": "Ubuntu 18.04 x64 20191022",
        "tags": [],
        "status": "available"
      },
      "volume_ids": [],
      "size": {
        "slug": "s-1vcpu-1gb",
        "memory": 1024,
        "vcpus": 1,
        "disk": 25,
        "transfer": 1,
        "price_monthly": 5,
        "price_hourly": 0.00744,
        "regions": [
          "ams2",
          "ams3",
          "blr1",
          "fra1",
          "lon1",
          "nyc1",
          "nyc2",
          "nyc3",
          "sfo1",
          "sfo2",
          "sfo3",
          "sgp1",
          "tor1"
        ],
        "available": true
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "167.172.111.118",
            "netmask": "255.255.240.0",
            "gateway": "167.172.176.1",
            "type": "public"
          },
          {
            "ip_address": "10.135.64.211",
            "netmask": "255.255.0.0",
            "gateway": "10.135.0.1",
            "type": "private"
          }
        ],
        "v6": [
        ]
      },
      "region": {
        "name": "Frankfurt 1",
        "slug": "fra1",
        "features": [
          "private_networking",
          "backups",
          "ipv6",
          "metadata",
          "install_agent",
          "storage",
          "image_transfer"
        ],
        "available": true,
        "sizes": [
          "s-1vcpu-1gb",
          "512mb",
          "s-1vcpu-2gb",
          "1gb",
          "s-3vcpu-1gb",
          "s-2vcpu-2gb",
          "s-1vcpu-3gb",
          "s-2vcpu-4gb",
          "2gb",
          "s-4vcpu-8gb",
          "m-1vcpu-8gb",
          "c-2",
          "4gb",
          "g-2vcpu-8gb",
          "gd-2vcpu-8gb",
          "m-16gb",
          "s-6vcpu-16gb",
          "c-4",
          "8gb",
          "m-2vcpu-16gb",
          "m3-2vcpu-16gb",
          "g-4vcpu-16gb",
          "gd-4vcpu-16gb",
          "m6-2vcpu-16gb",
          "m-32gb",
          "s-8vcpu-32gb",
          "c-8",
          "16gb",
          "m-4vcpu-32gb",
          "m3-4vcpu-32gb",
          "g-8vcpu-32gb",
          "s-12vcpu-48gb",
          "gd-8vcpu-32gb",
          "m6-4vcpu-32gb",
          "m-64gb",
          "s-16vcpu-64gb",
          "c-16",
          "32gb",
          "m-8vcpu-64gb",
          "m3-8vcpu-64gb",
          "g-16vcpu-64gb",
          "s-20vcpu-96gb",
          "48gb",
          "gd-16vcpu-64gb",
          "m6-8vcpu-64gb",
          "m-128gb",
          "s-24vcpu-128gb",
          "c-32",
          "64gb",
          "m-16vcpu-128gb",
          "m3-16vcpu-128gb",
          "s-32vcpu-192gb",
          "m-24vcpu-192gb",
          "m-224gb",
          "m6-16vcpu-128gb",
          "m3-24vcpu-192gb",
          "m6-24vcpu-192gb"
        ]
      },
      "tags": [],
      "vpc_uuid": "953d698c-dc84-11e8-80bc-3cfdfea9fba1"
    },
    {
      "id": 176011507,
      "name": "prometheus-demo",
      "memory": 1024,
      "vcpus": 1,
      "disk": 25,
      "locked": false,
      "status": "active",
      "kernel": null,
      "created_at": "2020-01-17T12:06:26Z",
      "features": [
        "ipv6",
        "private_networking"
      ],
      "backup_ids": [],
      "next_backup_window": null,
      "snapshot_ids": [],
      "image": {
        "id": 53893572,
        "name": "18.04.3 (LTS) x64",
        "distribution": "Ubuntu",
        "slug": "ubuntu-18-04-x64",
        "public": true,
        "regions": [
          "nyc3",
          "nyc1",
          "sfo1",
          "nyc2",
          "ams2",
          "sgp1",
          "lon1",
          "nyc3",
          "ams3",
          "fra1",
          "tor1",
          "sfo2",
          "blr1",
          "sfo3"
        ],
        "created_at": "2019-10-22T01:38:19Z",
        "min_disk_size": 20,
        "type": "base",
        "size_gigabytes": 2.36,
        "description": "Ubuntu 18.04 x64 20191022",
        "tags": [],
        "status": "available"
      },
      "volume_ids": [],
      "size": {
        "slug": "s-1vcpu-1gb",
        "memory": 1024,
        "vcpus": 1,
        "disk": 25,
        "transfer": 1,
        "price_monthly": 5,
        "price_hourly": 0.00744,
        "regions": [
          "ams2",
          "ams3",
          "blr1",
          "fra1",
          "lon1",
          "nyc1",
          "nyc2",
          "nyc3",
          "sfo1",
          "sfo2",
          "sfo3",
          "sgp1",
          "tor1"
        ],
        "available": true
      },
      "size_slug": "s-1vcpu-1gb",
      "networks": {
        "v4": [
          {
            "ip_address": "138.65.56.69",
            "netmask": "255.255.240.0",
            "gateway": "138.65.64.1",
            "type": "public"
          },
          {
            "ip_address": "154.245.26.111",
            "netmask": "255.255.252.0",
            "gateway": "154.245.24.1",
            "type": "public"
          },
          {
            "ip_address": "10.135.64.212",
            "netmask": "255.255.0.0",
            "gateway": "10.135.0.1",
            "type": "private"
          }
        ],
        "v6": [
          {
            "ip_address": "2a03:b0c0:3:f0::cf2:4",
            "netmask": 64,
            "gateway": "2a03:b0c0:3:f0::1",
            "type": "public"
          }
        ]
      },
      "region": {
        "name": "Frankfurt 1",
        "slug": "fra1",
        "features": [
          "private_networking",
          "backups",
          "ipv6",
          "metadata",
          "install_agent",
          "storage",
          "image_transfer"
        ],
        "available": true,
        "sizes": [
          "s-1vcpu-1gb",
          "512mb",
          "s-1vcpu-2gb",
          "1gb",
          "s-3vcpu-1gb",
          "s-2vcpu-2gb",
          "s-1vcpu-3gb",
          "s-2vcpu-4gb",
          "2gb",
          "s-4vcpu-8gb",
          "m-1vcpu-8gb",
          "c-2",
          "4gb",
          "g-2vcpu-8gb",
          "gd-2vcpu-8gb",
          "m-16gb",
          "s-6vcpu-16gb",
          "c-4",
          "8gb",
          "m-2vcpu-16gb",
          "m3-2vcpu-16gb",
          "g-4vcpu-16gb",
          "gd-4vcpu-16gb",
          "m6-2vcpu-16gb",
          "m-32gb",
          "s-8vcpu-32gb",
          "c-8",
          "16gb",
          "m-4vcpu-32gb",
          "m3-4vcpu-32gb",
          "g-8vcpu-32gb",
          "s-12vcpu-48gb",
          "gd-8vcpu-32gb",
          "m6-4vcpu-32gb",
          "m-64gb",
          "s-16vcpu-64gb",
          "c-16",
          "32gb",
          "m-8vcpu-64gb",
          "m3-8vcpu-64gb",
          "g-16vcpu-64gb",
          "s-20vcpu-96gb",
          "48gb",
          "gd-16vcpu-64gb",
          "m6-8vcpu-64gb",
          "m-128gb",
          "s-24vcpu-128gb",
          "c-32",
          "64gb",
          "m-16vcpu-128gb",
          "m3-16vcpu-128gb",
          "s-32vcpu-192gb",
          "m-24vcpu-192gb",
          "m-224gb",
          "m6-16vcpu-128gb",
          "m3-24vcpu-192gb",
          "m6-24vcpu-192gb"
        ]
      },
      "tags": [],
      "vpc_uuid": "953d698c-dc84-11e8-80bc-3cfdfea9fba1"
    }
  ],
  "links": {
    "pages": {
      "first": "https://api.digitalocean.com/v2/droplets?page=1&per_page=2",
      "prev": "https://api.digitalocean.com/v2/droplets?page=1&per_page=2"
    }
  },
  "meta": {
    "total": 4
  }
}
`,
		}[page-1],
		)
	})
}

// HandleDatabasesList mocks database clusters list.
func (m *SDMock) HandleDatabasesList() {
	m.Mux.HandleFunc("/v2/databases", func(w http.ResponseWriter, r *http.Request) {
		page := r.URL.Query().Get("page")
		switch page {
		case "1", "":
			fmt.Fprint(w, `
{
  "databases": [
    {
      "id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30",
      "name": "do-fra1-pg-trading-001",
      "engine": "pg",
      "version": "16",
      "status": "online",
      "region": "fra1",
      "size": "db-s-1vcpu-2gb",
      "num_nodes": 1,
      "connection": {
        "host": "do-fra1-pg-trading-001-do-user-XXXXX-0.f.db.ondigitalocean.com",
        "port": 25060,
        "user": "doadmin",
        "password": "XXX",
        "database": "defaultdb",
        "ssl": true
      },
      "tags": ["prod", "market"]
    }
  ],
  "links": {
    "pages": {
      "next": "http://example.com/v2/databases?page=2"
    }
  }
}
`)
		case "2":
			fmt.Fprint(w, `
{
  "databases": [
    {
      "id": "a0b1c2d3-e4f5-4677-8899-001122334455",
      "name": "private-db",
      "engine": "mysql",
      "version": "8",
      "status": "online",
      "region": "nyc1",
      "size": "db-s-2vcpu-4gb",
      "num_nodes": 2,
      "connection": {
        "host": "public-db-host"
      },
      "private_connection": {
        "host": "private-db-host"
      }
    }
  ]
}
`)
		default:
			fmt.Fprint(w, `{"databases": []}`)
		}
	})
}
