package nodes

import (
	"gerrit.mcp.mirantis.net/debian/gophercloud.git"
	"gerrit.mcp.mirantis.net/debian/gophercloud.git/pagination"
)

type commonResult struct {
	gophercloud.Result
}

func (r commonResult) Extract() (*Node, error) {
	var n struct {
		Node *Node `json:"node"`
	}
	err := r.ExtractInto(&n)
	return n.Node, err
}

type GetResult struct {
	commonResult
}

type Link struct {
	Href string `json:"href"`
	Rel  string `json:"rel"`
}

type Node struct {
	UUID           string `json:"uuid"`
	InstanceUUID   string `json:"InstanceUUID"`
	PowerState     string `json:"power_state"`
	ProvisionState string `json:"provision_state"`
	Maintenance    bool   `json:"maintenance"`
	Links          []Link `json:"links"`
}

type NodePage struct {
	pagination.SinglePageBase
}

func (r NodePage) NextPageURL() (string, error) {
	var n struct {
		Links []gophercloud.Link `json:"nodes_links"`
	}
	err := r.ExtractInto(&n)
	if err != nil {
		return "", err
	}
	return gophercloud.ExtractNextURL(n.Links)
}

func (r NodePage) IsEmpty() (bool, error) {
	is, err := ExtractNodes(r)
	return len(is) == 0, err
}

func ExtractNodes(r pagination.Page) ([]Node, error) {
	var n struct {
		Nodes []Node `json:"nodes"`
	}
	err := (r.(NodePage)).ExtractInto(&n)
	return n.Nodes, err
}
