//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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 cloudstack

import (
	"encoding/json"
	"fmt"
	"net/url"
	"strconv"
	"strings"
)

type RouterServiceIface interface {
	ChangeServiceForRouter(p *ChangeServiceForRouterParams) (*ChangeServiceForRouterResponse, error)
	NewChangeServiceForRouterParams(id string, serviceofferingid string) *ChangeServiceForRouterParams
	ConfigureVirtualRouterElement(p *ConfigureVirtualRouterElementParams) (*VirtualRouterElementResponse, error)
	NewConfigureVirtualRouterElementParams(enabled bool, id string) *ConfigureVirtualRouterElementParams
	CreateVirtualRouterElement(p *CreateVirtualRouterElementParams) (*CreateVirtualRouterElementResponse, error)
	NewCreateVirtualRouterElementParams(nspid string) *CreateVirtualRouterElementParams
	DestroyRouter(p *DestroyRouterParams) (*DestroyRouterResponse, error)
	NewDestroyRouterParams(id string) *DestroyRouterParams
	ListRouters(p *ListRoutersParams) (*ListRoutersResponse, error)
	NewListRoutersParams() *ListRoutersParams
	GetRouterID(name string, opts ...OptionFunc) (string, int, error)
	GetRouterByName(name string, opts ...OptionFunc) (*Router, int, error)
	GetRouterByID(id string, opts ...OptionFunc) (*Router, int, error)
	ListVirtualRouterElements(p *ListVirtualRouterElementsParams) (*ListVirtualRouterElementsResponse, error)
	NewListVirtualRouterElementsParams() *ListVirtualRouterElementsParams
	GetVirtualRouterElementByID(id string, opts ...OptionFunc) (*VirtualRouterElement, int, error)
	RebootRouter(p *RebootRouterParams) (*RebootRouterResponse, error)
	NewRebootRouterParams(id string) *RebootRouterParams
	StartRouter(p *StartRouterParams) (*StartRouterResponse, error)
	NewStartRouterParams(id string) *StartRouterParams
	StopRouter(p *StopRouterParams) (*StopRouterResponse, error)
	NewStopRouterParams(id string) *StopRouterParams
}

type ChangeServiceForRouterParams struct {
	p map[string]interface{}
}

func (p *ChangeServiceForRouterParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	if v, found := p.p["serviceofferingid"]; found {
		u.Set("serviceofferingid", v.(string))
	}
	return u
}

func (p *ChangeServiceForRouterParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *ChangeServiceForRouterParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

func (p *ChangeServiceForRouterParams) SetServiceofferingid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["serviceofferingid"] = v
}

func (p *ChangeServiceForRouterParams) GetServiceofferingid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["serviceofferingid"].(string)
	return value, ok
}

// You should always use this function to get a new ChangeServiceForRouterParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewChangeServiceForRouterParams(id string, serviceofferingid string) *ChangeServiceForRouterParams {
	p := &ChangeServiceForRouterParams{}
	p.p = make(map[string]interface{})
	p.p["id"] = id
	p.p["serviceofferingid"] = serviceofferingid
	return p
}

// Upgrades domain router to a new service offering
func (s *RouterService) ChangeServiceForRouter(p *ChangeServiceForRouterParams) (*ChangeServiceForRouterResponse, error) {
	resp, err := s.cs.newRequest("changeServiceForRouter", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r ChangeServiceForRouterResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	return &r, nil
}

type ChangeServiceForRouterResponse struct {
	Account             string                                             `json:"account"`
	Created             string                                             `json:"created"`
	Dns1                string                                             `json:"dns1"`
	Dns2                string                                             `json:"dns2"`
	Domain              string                                             `json:"domain"`
	Domainid            string                                             `json:"domainid"`
	Gateway             string                                             `json:"gateway"`
	Guestipaddress      string                                             `json:"guestipaddress"`
	Guestmacaddress     string                                             `json:"guestmacaddress"`
	Guestnetmask        string                                             `json:"guestnetmask"`
	Guestnetworkid      string                                             `json:"guestnetworkid"`
	Guestnetworkname    string                                             `json:"guestnetworkname"`
	Hasannotations      bool                                               `json:"hasannotations"`
	Healthcheckresults  []ChangeServiceForRouterResponseHealthcheckresults `json:"healthcheckresults"`
	Healthchecksfailed  bool                                               `json:"healthchecksfailed"`
	Hostid              string                                             `json:"hostid"`
	Hostname            string                                             `json:"hostname"`
	Hypervisor          string                                             `json:"hypervisor"`
	Id                  string                                             `json:"id"`
	Ip6dns1             string                                             `json:"ip6dns1"`
	Ip6dns2             string                                             `json:"ip6dns2"`
	Isredundantrouter   bool                                               `json:"isredundantrouter"`
	JobID               string                                             `json:"jobid"`
	Jobstatus           int                                                `json:"jobstatus"`
	Linklocalip         string                                             `json:"linklocalip"`
	Linklocalmacaddress string                                             `json:"linklocalmacaddress"`
	Linklocalnetmask    string                                             `json:"linklocalnetmask"`
	Linklocalnetworkid  string                                             `json:"linklocalnetworkid"`
	Name                string                                             `json:"name"`
	Networkdomain       string                                             `json:"networkdomain"`
	Nic                 []Nic                                              `json:"nic"`
	Podid               string                                             `json:"podid"`
	Podname             string                                             `json:"podname"`
	Project             string                                             `json:"project"`
	Projectid           string                                             `json:"projectid"`
	Publicip            string                                             `json:"publicip"`
	Publicmacaddress    string                                             `json:"publicmacaddress"`
	Publicnetmask       string                                             `json:"publicnetmask"`
	Publicnetworkid     string                                             `json:"publicnetworkid"`
	Redundantstate      string                                             `json:"redundantstate"`
	Requiresupgrade     bool                                               `json:"requiresupgrade"`
	Role                string                                             `json:"role"`
	Scriptsversion      string                                             `json:"scriptsversion"`
	Serviceofferingid   string                                             `json:"serviceofferingid"`
	Serviceofferingname string                                             `json:"serviceofferingname"`
	State               string                                             `json:"state"`
	Templateid          string                                             `json:"templateid"`
	Templatename        string                                             `json:"templatename"`
	Version             string                                             `json:"version"`
	Vpcid               string                                             `json:"vpcid"`
	Vpcname             string                                             `json:"vpcname"`
	Zoneid              string                                             `json:"zoneid"`
	Zonename            string                                             `json:"zonename"`
}

type ChangeServiceForRouterResponseHealthcheckresults struct {
	Checkname   string `json:"checkname"`
	Checktype   string `json:"checktype"`
	Details     string `json:"details"`
	Lastupdated string `json:"lastupdated"`
	Success     bool   `json:"success"`
}

type ConfigureVirtualRouterElementParams struct {
	p map[string]interface{}
}

func (p *ConfigureVirtualRouterElementParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["enabled"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("enabled", vv)
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	return u
}

func (p *ConfigureVirtualRouterElementParams) SetEnabled(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["enabled"] = v
}

func (p *ConfigureVirtualRouterElementParams) GetEnabled() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["enabled"].(bool)
	return value, ok
}

func (p *ConfigureVirtualRouterElementParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *ConfigureVirtualRouterElementParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

// You should always use this function to get a new ConfigureVirtualRouterElementParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewConfigureVirtualRouterElementParams(enabled bool, id string) *ConfigureVirtualRouterElementParams {
	p := &ConfigureVirtualRouterElementParams{}
	p.p = make(map[string]interface{})
	p.p["enabled"] = enabled
	p.p["id"] = id
	return p
}

// Configures a virtual router element.
func (s *RouterService) ConfigureVirtualRouterElement(p *ConfigureVirtualRouterElementParams) (*VirtualRouterElementResponse, error) {
	resp, err := s.cs.newRequest("configureVirtualRouterElement", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r VirtualRouterElementResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	// If we have a async client, we need to wait for the async result
	if s.cs.async {
		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
		if err != nil {
			if err == AsyncTimeoutErr {
				return &r, err
			}
			return nil, err
		}

		b, err = getRawValue(b)
		if err != nil {
			return nil, err
		}

		if err := json.Unmarshal(b, &r); err != nil {
			return nil, err
		}
	}

	return &r, nil
}

type VirtualRouterElementResponse struct {
	Account   string `json:"account"`
	Domain    string `json:"domain"`
	Domainid  string `json:"domainid"`
	Enabled   bool   `json:"enabled"`
	Id        string `json:"id"`
	JobID     string `json:"jobid"`
	Jobstatus int    `json:"jobstatus"`
	Nspid     string `json:"nspid"`
	Project   string `json:"project"`
	Projectid string `json:"projectid"`
}

type CreateVirtualRouterElementParams struct {
	p map[string]interface{}
}

func (p *CreateVirtualRouterElementParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["nspid"]; found {
		u.Set("nspid", v.(string))
	}
	if v, found := p.p["providertype"]; found {
		u.Set("providertype", v.(string))
	}
	return u
}

func (p *CreateVirtualRouterElementParams) SetNspid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["nspid"] = v
}

func (p *CreateVirtualRouterElementParams) GetNspid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["nspid"].(string)
	return value, ok
}

func (p *CreateVirtualRouterElementParams) SetProvidertype(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["providertype"] = v
}

func (p *CreateVirtualRouterElementParams) GetProvidertype() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["providertype"].(string)
	return value, ok
}

// You should always use this function to get a new CreateVirtualRouterElementParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewCreateVirtualRouterElementParams(nspid string) *CreateVirtualRouterElementParams {
	p := &CreateVirtualRouterElementParams{}
	p.p = make(map[string]interface{})
	p.p["nspid"] = nspid
	return p
}

// Create a virtual router element.
func (s *RouterService) CreateVirtualRouterElement(p *CreateVirtualRouterElementParams) (*CreateVirtualRouterElementResponse, error) {
	resp, err := s.cs.newRequest("createVirtualRouterElement", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r CreateVirtualRouterElementResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	// If we have a async client, we need to wait for the async result
	if s.cs.async {
		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
		if err != nil {
			if err == AsyncTimeoutErr {
				return &r, err
			}
			return nil, err
		}

		b, err = getRawValue(b)
		if err != nil {
			return nil, err
		}

		if err := json.Unmarshal(b, &r); err != nil {
			return nil, err
		}
	}

	return &r, nil
}

type CreateVirtualRouterElementResponse struct {
	Account   string `json:"account"`
	Domain    string `json:"domain"`
	Domainid  string `json:"domainid"`
	Enabled   bool   `json:"enabled"`
	Id        string `json:"id"`
	JobID     string `json:"jobid"`
	Jobstatus int    `json:"jobstatus"`
	Nspid     string `json:"nspid"`
	Project   string `json:"project"`
	Projectid string `json:"projectid"`
}

type DestroyRouterParams struct {
	p map[string]interface{}
}

func (p *DestroyRouterParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	return u
}

func (p *DestroyRouterParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *DestroyRouterParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

// You should always use this function to get a new DestroyRouterParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewDestroyRouterParams(id string) *DestroyRouterParams {
	p := &DestroyRouterParams{}
	p.p = make(map[string]interface{})
	p.p["id"] = id
	return p
}

// Destroys a router.
func (s *RouterService) DestroyRouter(p *DestroyRouterParams) (*DestroyRouterResponse, error) {
	resp, err := s.cs.newRequest("destroyRouter", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r DestroyRouterResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	// If we have a async client, we need to wait for the async result
	if s.cs.async {
		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
		if err != nil {
			if err == AsyncTimeoutErr {
				return &r, err
			}
			return nil, err
		}

		b, err = getRawValue(b)
		if err != nil {
			return nil, err
		}

		if err := json.Unmarshal(b, &r); err != nil {
			return nil, err
		}
	}

	return &r, nil
}

type DestroyRouterResponse struct {
	Account             string                                    `json:"account"`
	Created             string                                    `json:"created"`
	Dns1                string                                    `json:"dns1"`
	Dns2                string                                    `json:"dns2"`
	Domain              string                                    `json:"domain"`
	Domainid            string                                    `json:"domainid"`
	Gateway             string                                    `json:"gateway"`
	Guestipaddress      string                                    `json:"guestipaddress"`
	Guestmacaddress     string                                    `json:"guestmacaddress"`
	Guestnetmask        string                                    `json:"guestnetmask"`
	Guestnetworkid      string                                    `json:"guestnetworkid"`
	Guestnetworkname    string                                    `json:"guestnetworkname"`
	Hasannotations      bool                                      `json:"hasannotations"`
	Healthcheckresults  []DestroyRouterResponseHealthcheckresults `json:"healthcheckresults"`
	Healthchecksfailed  bool                                      `json:"healthchecksfailed"`
	Hostid              string                                    `json:"hostid"`
	Hostname            string                                    `json:"hostname"`
	Hypervisor          string                                    `json:"hypervisor"`
	Id                  string                                    `json:"id"`
	Ip6dns1             string                                    `json:"ip6dns1"`
	Ip6dns2             string                                    `json:"ip6dns2"`
	Isredundantrouter   bool                                      `json:"isredundantrouter"`
	JobID               string                                    `json:"jobid"`
	Jobstatus           int                                       `json:"jobstatus"`
	Linklocalip         string                                    `json:"linklocalip"`
	Linklocalmacaddress string                                    `json:"linklocalmacaddress"`
	Linklocalnetmask    string                                    `json:"linklocalnetmask"`
	Linklocalnetworkid  string                                    `json:"linklocalnetworkid"`
	Name                string                                    `json:"name"`
	Networkdomain       string                                    `json:"networkdomain"`
	Nic                 []Nic                                     `json:"nic"`
	Podid               string                                    `json:"podid"`
	Podname             string                                    `json:"podname"`
	Project             string                                    `json:"project"`
	Projectid           string                                    `json:"projectid"`
	Publicip            string                                    `json:"publicip"`
	Publicmacaddress    string                                    `json:"publicmacaddress"`
	Publicnetmask       string                                    `json:"publicnetmask"`
	Publicnetworkid     string                                    `json:"publicnetworkid"`
	Redundantstate      string                                    `json:"redundantstate"`
	Requiresupgrade     bool                                      `json:"requiresupgrade"`
	Role                string                                    `json:"role"`
	Scriptsversion      string                                    `json:"scriptsversion"`
	Serviceofferingid   string                                    `json:"serviceofferingid"`
	Serviceofferingname string                                    `json:"serviceofferingname"`
	State               string                                    `json:"state"`
	Templateid          string                                    `json:"templateid"`
	Templatename        string                                    `json:"templatename"`
	Version             string                                    `json:"version"`
	Vpcid               string                                    `json:"vpcid"`
	Vpcname             string                                    `json:"vpcname"`
	Zoneid              string                                    `json:"zoneid"`
	Zonename            string                                    `json:"zonename"`
}

type DestroyRouterResponseHealthcheckresults struct {
	Checkname   string `json:"checkname"`
	Checktype   string `json:"checktype"`
	Details     string `json:"details"`
	Lastupdated string `json:"lastupdated"`
	Success     bool   `json:"success"`
}

type ListRoutersParams struct {
	p map[string]interface{}
}

func (p *ListRoutersParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["account"]; found {
		u.Set("account", v.(string))
	}
	if v, found := p.p["clusterid"]; found {
		u.Set("clusterid", v.(string))
	}
	if v, found := p.p["domainid"]; found {
		u.Set("domainid", v.(string))
	}
	if v, found := p.p["fetchhealthcheckresults"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("fetchhealthcheckresults", vv)
	}
	if v, found := p.p["forvpc"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("forvpc", vv)
	}
	if v, found := p.p["healthchecksfailed"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("healthchecksfailed", vv)
	}
	if v, found := p.p["hostid"]; found {
		u.Set("hostid", v.(string))
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	if v, found := p.p["isrecursive"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isrecursive", vv)
	}
	if v, found := p.p["keyword"]; found {
		u.Set("keyword", v.(string))
	}
	if v, found := p.p["listall"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("listall", vv)
	}
	if v, found := p.p["name"]; found {
		u.Set("name", v.(string))
	}
	if v, found := p.p["networkid"]; found {
		u.Set("networkid", v.(string))
	}
	if v, found := p.p["page"]; found {
		vv := strconv.Itoa(v.(int))
		u.Set("page", vv)
	}
	if v, found := p.p["pagesize"]; found {
		vv := strconv.Itoa(v.(int))
		u.Set("pagesize", vv)
	}
	if v, found := p.p["podid"]; found {
		u.Set("podid", v.(string))
	}
	if v, found := p.p["projectid"]; found {
		u.Set("projectid", v.(string))
	}
	if v, found := p.p["state"]; found {
		u.Set("state", v.(string))
	}
	if v, found := p.p["version"]; found {
		u.Set("version", v.(string))
	}
	if v, found := p.p["vpcid"]; found {
		u.Set("vpcid", v.(string))
	}
	if v, found := p.p["zoneid"]; found {
		u.Set("zoneid", v.(string))
	}
	return u
}

func (p *ListRoutersParams) SetAccount(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["account"] = v
}

func (p *ListRoutersParams) GetAccount() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["account"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetClusterid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["clusterid"] = v
}

func (p *ListRoutersParams) GetClusterid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["clusterid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetDomainid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["domainid"] = v
}

func (p *ListRoutersParams) GetDomainid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["domainid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetFetchhealthcheckresults(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["fetchhealthcheckresults"] = v
}

func (p *ListRoutersParams) GetFetchhealthcheckresults() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["fetchhealthcheckresults"].(bool)
	return value, ok
}

func (p *ListRoutersParams) SetForvpc(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["forvpc"] = v
}

func (p *ListRoutersParams) GetForvpc() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["forvpc"].(bool)
	return value, ok
}

func (p *ListRoutersParams) SetHealthchecksfailed(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["healthchecksfailed"] = v
}

func (p *ListRoutersParams) GetHealthchecksfailed() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["healthchecksfailed"].(bool)
	return value, ok
}

func (p *ListRoutersParams) SetHostid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["hostid"] = v
}

func (p *ListRoutersParams) GetHostid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["hostid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *ListRoutersParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetIsrecursive(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isrecursive"] = v
}

func (p *ListRoutersParams) GetIsrecursive() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["isrecursive"].(bool)
	return value, ok
}

func (p *ListRoutersParams) SetKeyword(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["keyword"] = v
}

func (p *ListRoutersParams) GetKeyword() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["keyword"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetListall(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["listall"] = v
}

func (p *ListRoutersParams) GetListall() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["listall"].(bool)
	return value, ok
}

func (p *ListRoutersParams) SetName(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["name"] = v
}

func (p *ListRoutersParams) GetName() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["name"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetNetworkid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["networkid"] = v
}

func (p *ListRoutersParams) GetNetworkid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["networkid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetPage(v int) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["page"] = v
}

func (p *ListRoutersParams) GetPage() (int, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["page"].(int)
	return value, ok
}

func (p *ListRoutersParams) SetPagesize(v int) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["pagesize"] = v
}

func (p *ListRoutersParams) GetPagesize() (int, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["pagesize"].(int)
	return value, ok
}

func (p *ListRoutersParams) SetPodid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["podid"] = v
}

func (p *ListRoutersParams) GetPodid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["podid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetProjectid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["projectid"] = v
}

func (p *ListRoutersParams) GetProjectid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["projectid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetState(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["state"] = v
}

func (p *ListRoutersParams) GetState() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["state"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetVersion(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["version"] = v
}

func (p *ListRoutersParams) GetVersion() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["version"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetVpcid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["vpcid"] = v
}

func (p *ListRoutersParams) GetVpcid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["vpcid"].(string)
	return value, ok
}

func (p *ListRoutersParams) SetZoneid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["zoneid"] = v
}

func (p *ListRoutersParams) GetZoneid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["zoneid"].(string)
	return value, ok
}

// You should always use this function to get a new ListRoutersParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewListRoutersParams() *ListRoutersParams {
	p := &ListRoutersParams{}
	p.p = make(map[string]interface{})
	return p
}

// This is a courtesy helper function, which in some cases may not work as expected!
func (s *RouterService) GetRouterID(name string, opts ...OptionFunc) (string, int, error) {
	p := &ListRoutersParams{}
	p.p = make(map[string]interface{})

	p.p["name"] = name

	for _, fn := range append(s.cs.options, opts...) {
		if err := fn(s.cs, p); err != nil {
			return "", -1, err
		}
	}

	l, err := s.ListRouters(p)
	if err != nil {
		return "", -1, err
	}

	if l.Count == 0 {
		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
	}

	if l.Count == 1 {
		return l.Routers[0].Id, l.Count, nil
	}

	if l.Count > 1 {
		for _, v := range l.Routers {
			if v.Name == name {
				return v.Id, l.Count, nil
			}
		}
	}
	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
}

// This is a courtesy helper function, which in some cases may not work as expected!
func (s *RouterService) GetRouterByName(name string, opts ...OptionFunc) (*Router, int, error) {
	id, count, err := s.GetRouterID(name, opts...)
	if err != nil {
		return nil, count, err
	}

	r, count, err := s.GetRouterByID(id, opts...)
	if err != nil {
		return nil, count, err
	}
	return r, count, nil
}

// This is a courtesy helper function, which in some cases may not work as expected!
func (s *RouterService) GetRouterByID(id string, opts ...OptionFunc) (*Router, int, error) {
	p := &ListRoutersParams{}
	p.p = make(map[string]interface{})

	p.p["id"] = id

	for _, fn := range append(s.cs.options, opts...) {
		if err := fn(s.cs, p); err != nil {
			return nil, -1, err
		}
	}

	l, err := s.ListRouters(p)
	if err != nil {
		if strings.Contains(err.Error(), fmt.Sprintf(
			"Invalid parameter id value=%s due to incorrect long value format, "+
				"or entity does not exist", id)) {
			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
		}
		return nil, -1, err
	}

	if l.Count == 0 {
		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
	}

	if l.Count == 1 {
		return l.Routers[0], l.Count, nil
	}
	return nil, l.Count, fmt.Errorf("There is more then one result for Router UUID: %s!", id)
}

// List routers.
func (s *RouterService) ListRouters(p *ListRoutersParams) (*ListRoutersResponse, error) {
	resp, err := s.cs.newRequest("listRouters", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r ListRoutersResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	return &r, nil
}

type ListRoutersResponse struct {
	Count   int       `json:"count"`
	Routers []*Router `json:"router"`
}

type Router struct {
	Account             string                     `json:"account"`
	Created             string                     `json:"created"`
	Dns1                string                     `json:"dns1"`
	Dns2                string                     `json:"dns2"`
	Domain              string                     `json:"domain"`
	Domainid            string                     `json:"domainid"`
	Gateway             string                     `json:"gateway"`
	Guestipaddress      string                     `json:"guestipaddress"`
	Guestmacaddress     string                     `json:"guestmacaddress"`
	Guestnetmask        string                     `json:"guestnetmask"`
	Guestnetworkid      string                     `json:"guestnetworkid"`
	Guestnetworkname    string                     `json:"guestnetworkname"`
	Hasannotations      bool                       `json:"hasannotations"`
	Healthcheckresults  []RouterHealthcheckresults `json:"healthcheckresults"`
	Healthchecksfailed  bool                       `json:"healthchecksfailed"`
	Hostid              string                     `json:"hostid"`
	Hostname            string                     `json:"hostname"`
	Hypervisor          string                     `json:"hypervisor"`
	Id                  string                     `json:"id"`
	Ip6dns1             string                     `json:"ip6dns1"`
	Ip6dns2             string                     `json:"ip6dns2"`
	Isredundantrouter   bool                       `json:"isredundantrouter"`
	JobID               string                     `json:"jobid"`
	Jobstatus           int                        `json:"jobstatus"`
	Linklocalip         string                     `json:"linklocalip"`
	Linklocalmacaddress string                     `json:"linklocalmacaddress"`
	Linklocalnetmask    string                     `json:"linklocalnetmask"`
	Linklocalnetworkid  string                     `json:"linklocalnetworkid"`
	Name                string                     `json:"name"`
	Networkdomain       string                     `json:"networkdomain"`
	Nic                 []Nic                      `json:"nic"`
	Podid               string                     `json:"podid"`
	Podname             string                     `json:"podname"`
	Project             string                     `json:"project"`
	Projectid           string                     `json:"projectid"`
	Publicip            string                     `json:"publicip"`
	Publicmacaddress    string                     `json:"publicmacaddress"`
	Publicnetmask       string                     `json:"publicnetmask"`
	Publicnetworkid     string                     `json:"publicnetworkid"`
	Redundantstate      string                     `json:"redundantstate"`
	Requiresupgrade     bool                       `json:"requiresupgrade"`
	Role                string                     `json:"role"`
	Scriptsversion      string                     `json:"scriptsversion"`
	Serviceofferingid   string                     `json:"serviceofferingid"`
	Serviceofferingname string                     `json:"serviceofferingname"`
	State               string                     `json:"state"`
	Templateid          string                     `json:"templateid"`
	Templatename        string                     `json:"templatename"`
	Version             string                     `json:"version"`
	Vpcid               string                     `json:"vpcid"`
	Vpcname             string                     `json:"vpcname"`
	Zoneid              string                     `json:"zoneid"`
	Zonename            string                     `json:"zonename"`
}

type RouterHealthcheckresults struct {
	Checkname   string `json:"checkname"`
	Checktype   string `json:"checktype"`
	Details     string `json:"details"`
	Lastupdated string `json:"lastupdated"`
	Success     bool   `json:"success"`
}

type ListVirtualRouterElementsParams struct {
	p map[string]interface{}
}

func (p *ListVirtualRouterElementsParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["enabled"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("enabled", vv)
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	if v, found := p.p["keyword"]; found {
		u.Set("keyword", v.(string))
	}
	if v, found := p.p["nspid"]; found {
		u.Set("nspid", v.(string))
	}
	if v, found := p.p["page"]; found {
		vv := strconv.Itoa(v.(int))
		u.Set("page", vv)
	}
	if v, found := p.p["pagesize"]; found {
		vv := strconv.Itoa(v.(int))
		u.Set("pagesize", vv)
	}
	return u
}

func (p *ListVirtualRouterElementsParams) SetEnabled(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["enabled"] = v
}

func (p *ListVirtualRouterElementsParams) GetEnabled() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["enabled"].(bool)
	return value, ok
}

func (p *ListVirtualRouterElementsParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *ListVirtualRouterElementsParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

func (p *ListVirtualRouterElementsParams) SetKeyword(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["keyword"] = v
}

func (p *ListVirtualRouterElementsParams) GetKeyword() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["keyword"].(string)
	return value, ok
}

func (p *ListVirtualRouterElementsParams) SetNspid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["nspid"] = v
}

func (p *ListVirtualRouterElementsParams) GetNspid() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["nspid"].(string)
	return value, ok
}

func (p *ListVirtualRouterElementsParams) SetPage(v int) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["page"] = v
}

func (p *ListVirtualRouterElementsParams) GetPage() (int, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["page"].(int)
	return value, ok
}

func (p *ListVirtualRouterElementsParams) SetPagesize(v int) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["pagesize"] = v
}

func (p *ListVirtualRouterElementsParams) GetPagesize() (int, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["pagesize"].(int)
	return value, ok
}

// You should always use this function to get a new ListVirtualRouterElementsParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewListVirtualRouterElementsParams() *ListVirtualRouterElementsParams {
	p := &ListVirtualRouterElementsParams{}
	p.p = make(map[string]interface{})
	return p
}

// This is a courtesy helper function, which in some cases may not work as expected!
func (s *RouterService) GetVirtualRouterElementByID(id string, opts ...OptionFunc) (*VirtualRouterElement, int, error) {
	p := &ListVirtualRouterElementsParams{}
	p.p = make(map[string]interface{})

	p.p["id"] = id

	for _, fn := range append(s.cs.options, opts...) {
		if err := fn(s.cs, p); err != nil {
			return nil, -1, err
		}
	}

	l, err := s.ListVirtualRouterElements(p)
	if err != nil {
		if strings.Contains(err.Error(), fmt.Sprintf(
			"Invalid parameter id value=%s due to incorrect long value format, "+
				"or entity does not exist", id)) {
			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
		}
		return nil, -1, err
	}

	if l.Count == 0 {
		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
	}

	if l.Count == 1 {
		return l.VirtualRouterElements[0], l.Count, nil
	}
	return nil, l.Count, fmt.Errorf("There is more then one result for VirtualRouterElement UUID: %s!", id)
}

// Lists all available virtual router elements.
func (s *RouterService) ListVirtualRouterElements(p *ListVirtualRouterElementsParams) (*ListVirtualRouterElementsResponse, error) {
	resp, err := s.cs.newRequest("listVirtualRouterElements", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r ListVirtualRouterElementsResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	return &r, nil
}

type ListVirtualRouterElementsResponse struct {
	Count                 int                     `json:"count"`
	VirtualRouterElements []*VirtualRouterElement `json:"virtualrouterelement"`
}

type VirtualRouterElement struct {
	Account   string `json:"account"`
	Domain    string `json:"domain"`
	Domainid  string `json:"domainid"`
	Enabled   bool   `json:"enabled"`
	Id        string `json:"id"`
	JobID     string `json:"jobid"`
	Jobstatus int    `json:"jobstatus"`
	Nspid     string `json:"nspid"`
	Project   string `json:"project"`
	Projectid string `json:"projectid"`
}

type RebootRouterParams struct {
	p map[string]interface{}
}

func (p *RebootRouterParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["forced"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("forced", vv)
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	return u
}

func (p *RebootRouterParams) SetForced(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["forced"] = v
}

func (p *RebootRouterParams) GetForced() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["forced"].(bool)
	return value, ok
}

func (p *RebootRouterParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *RebootRouterParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

// You should always use this function to get a new RebootRouterParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewRebootRouterParams(id string) *RebootRouterParams {
	p := &RebootRouterParams{}
	p.p = make(map[string]interface{})
	p.p["id"] = id
	return p
}

// Starts a router.
func (s *RouterService) RebootRouter(p *RebootRouterParams) (*RebootRouterResponse, error) {
	resp, err := s.cs.newRequest("rebootRouter", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r RebootRouterResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	// If we have a async client, we need to wait for the async result
	if s.cs.async {
		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
		if err != nil {
			if err == AsyncTimeoutErr {
				return &r, err
			}
			return nil, err
		}

		b, err = getRawValue(b)
		if err != nil {
			return nil, err
		}

		if err := json.Unmarshal(b, &r); err != nil {
			return nil, err
		}
	}

	return &r, nil
}

type RebootRouterResponse struct {
	Account             string                                   `json:"account"`
	Created             string                                   `json:"created"`
	Dns1                string                                   `json:"dns1"`
	Dns2                string                                   `json:"dns2"`
	Domain              string                                   `json:"domain"`
	Domainid            string                                   `json:"domainid"`
	Gateway             string                                   `json:"gateway"`
	Guestipaddress      string                                   `json:"guestipaddress"`
	Guestmacaddress     string                                   `json:"guestmacaddress"`
	Guestnetmask        string                                   `json:"guestnetmask"`
	Guestnetworkid      string                                   `json:"guestnetworkid"`
	Guestnetworkname    string                                   `json:"guestnetworkname"`
	Hasannotations      bool                                     `json:"hasannotations"`
	Healthcheckresults  []RebootRouterResponseHealthcheckresults `json:"healthcheckresults"`
	Healthchecksfailed  bool                                     `json:"healthchecksfailed"`
	Hostid              string                                   `json:"hostid"`
	Hostname            string                                   `json:"hostname"`
	Hypervisor          string                                   `json:"hypervisor"`
	Id                  string                                   `json:"id"`
	Ip6dns1             string                                   `json:"ip6dns1"`
	Ip6dns2             string                                   `json:"ip6dns2"`
	Isredundantrouter   bool                                     `json:"isredundantrouter"`
	JobID               string                                   `json:"jobid"`
	Jobstatus           int                                      `json:"jobstatus"`
	Linklocalip         string                                   `json:"linklocalip"`
	Linklocalmacaddress string                                   `json:"linklocalmacaddress"`
	Linklocalnetmask    string                                   `json:"linklocalnetmask"`
	Linklocalnetworkid  string                                   `json:"linklocalnetworkid"`
	Name                string                                   `json:"name"`
	Networkdomain       string                                   `json:"networkdomain"`
	Nic                 []Nic                                    `json:"nic"`
	Podid               string                                   `json:"podid"`
	Podname             string                                   `json:"podname"`
	Project             string                                   `json:"project"`
	Projectid           string                                   `json:"projectid"`
	Publicip            string                                   `json:"publicip"`
	Publicmacaddress    string                                   `json:"publicmacaddress"`
	Publicnetmask       string                                   `json:"publicnetmask"`
	Publicnetworkid     string                                   `json:"publicnetworkid"`
	Redundantstate      string                                   `json:"redundantstate"`
	Requiresupgrade     bool                                     `json:"requiresupgrade"`
	Role                string                                   `json:"role"`
	Scriptsversion      string                                   `json:"scriptsversion"`
	Serviceofferingid   string                                   `json:"serviceofferingid"`
	Serviceofferingname string                                   `json:"serviceofferingname"`
	State               string                                   `json:"state"`
	Templateid          string                                   `json:"templateid"`
	Templatename        string                                   `json:"templatename"`
	Version             string                                   `json:"version"`
	Vpcid               string                                   `json:"vpcid"`
	Vpcname             string                                   `json:"vpcname"`
	Zoneid              string                                   `json:"zoneid"`
	Zonename            string                                   `json:"zonename"`
}

type RebootRouterResponseHealthcheckresults struct {
	Checkname   string `json:"checkname"`
	Checktype   string `json:"checktype"`
	Details     string `json:"details"`
	Lastupdated string `json:"lastupdated"`
	Success     bool   `json:"success"`
}

type StartRouterParams struct {
	p map[string]interface{}
}

func (p *StartRouterParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	return u
}

func (p *StartRouterParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *StartRouterParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

// You should always use this function to get a new StartRouterParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewStartRouterParams(id string) *StartRouterParams {
	p := &StartRouterParams{}
	p.p = make(map[string]interface{})
	p.p["id"] = id
	return p
}

// Starts a router.
func (s *RouterService) StartRouter(p *StartRouterParams) (*StartRouterResponse, error) {
	resp, err := s.cs.newRequest("startRouter", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r StartRouterResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	// If we have a async client, we need to wait for the async result
	if s.cs.async {
		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
		if err != nil {
			if err == AsyncTimeoutErr {
				return &r, err
			}
			return nil, err
		}

		b, err = getRawValue(b)
		if err != nil {
			return nil, err
		}

		if err := json.Unmarshal(b, &r); err != nil {
			return nil, err
		}
	}

	return &r, nil
}

type StartRouterResponse struct {
	Account             string                                  `json:"account"`
	Created             string                                  `json:"created"`
	Dns1                string                                  `json:"dns1"`
	Dns2                string                                  `json:"dns2"`
	Domain              string                                  `json:"domain"`
	Domainid            string                                  `json:"domainid"`
	Gateway             string                                  `json:"gateway"`
	Guestipaddress      string                                  `json:"guestipaddress"`
	Guestmacaddress     string                                  `json:"guestmacaddress"`
	Guestnetmask        string                                  `json:"guestnetmask"`
	Guestnetworkid      string                                  `json:"guestnetworkid"`
	Guestnetworkname    string                                  `json:"guestnetworkname"`
	Hasannotations      bool                                    `json:"hasannotations"`
	Healthcheckresults  []StartRouterResponseHealthcheckresults `json:"healthcheckresults"`
	Healthchecksfailed  bool                                    `json:"healthchecksfailed"`
	Hostid              string                                  `json:"hostid"`
	Hostname            string                                  `json:"hostname"`
	Hypervisor          string                                  `json:"hypervisor"`
	Id                  string                                  `json:"id"`
	Ip6dns1             string                                  `json:"ip6dns1"`
	Ip6dns2             string                                  `json:"ip6dns2"`
	Isredundantrouter   bool                                    `json:"isredundantrouter"`
	JobID               string                                  `json:"jobid"`
	Jobstatus           int                                     `json:"jobstatus"`
	Linklocalip         string                                  `json:"linklocalip"`
	Linklocalmacaddress string                                  `json:"linklocalmacaddress"`
	Linklocalnetmask    string                                  `json:"linklocalnetmask"`
	Linklocalnetworkid  string                                  `json:"linklocalnetworkid"`
	Name                string                                  `json:"name"`
	Networkdomain       string                                  `json:"networkdomain"`
	Nic                 []Nic                                   `json:"nic"`
	Podid               string                                  `json:"podid"`
	Podname             string                                  `json:"podname"`
	Project             string                                  `json:"project"`
	Projectid           string                                  `json:"projectid"`
	Publicip            string                                  `json:"publicip"`
	Publicmacaddress    string                                  `json:"publicmacaddress"`
	Publicnetmask       string                                  `json:"publicnetmask"`
	Publicnetworkid     string                                  `json:"publicnetworkid"`
	Redundantstate      string                                  `json:"redundantstate"`
	Requiresupgrade     bool                                    `json:"requiresupgrade"`
	Role                string                                  `json:"role"`
	Scriptsversion      string                                  `json:"scriptsversion"`
	Serviceofferingid   string                                  `json:"serviceofferingid"`
	Serviceofferingname string                                  `json:"serviceofferingname"`
	State               string                                  `json:"state"`
	Templateid          string                                  `json:"templateid"`
	Templatename        string                                  `json:"templatename"`
	Version             string                                  `json:"version"`
	Vpcid               string                                  `json:"vpcid"`
	Vpcname             string                                  `json:"vpcname"`
	Zoneid              string                                  `json:"zoneid"`
	Zonename            string                                  `json:"zonename"`
}

type StartRouterResponseHealthcheckresults struct {
	Checkname   string `json:"checkname"`
	Checktype   string `json:"checktype"`
	Details     string `json:"details"`
	Lastupdated string `json:"lastupdated"`
	Success     bool   `json:"success"`
}

type StopRouterParams struct {
	p map[string]interface{}
}

func (p *StopRouterParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["forced"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("forced", vv)
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	return u
}

func (p *StopRouterParams) SetForced(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["forced"] = v
}

func (p *StopRouterParams) GetForced() (bool, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["forced"].(bool)
	return value, ok
}

func (p *StopRouterParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
}

func (p *StopRouterParams) GetId() (string, bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	value, ok := p.p["id"].(string)
	return value, ok
}

// You should always use this function to get a new StopRouterParams instance,
// as then you are sure you have configured all required params
func (s *RouterService) NewStopRouterParams(id string) *StopRouterParams {
	p := &StopRouterParams{}
	p.p = make(map[string]interface{})
	p.p["id"] = id
	return p
}

// Stops a router.
func (s *RouterService) StopRouter(p *StopRouterParams) (*StopRouterResponse, error) {
	resp, err := s.cs.newRequest("stopRouter", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r StopRouterResponse
	if err := json.Unmarshal(resp, &r); err != nil {
		return nil, err
	}

	// If we have a async client, we need to wait for the async result
	if s.cs.async {
		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
		if err != nil {
			if err == AsyncTimeoutErr {
				return &r, err
			}
			return nil, err
		}

		b, err = getRawValue(b)
		if err != nil {
			return nil, err
		}

		if err := json.Unmarshal(b, &r); err != nil {
			return nil, err
		}
	}

	return &r, nil
}

type StopRouterResponse struct {
	Account             string                                 `json:"account"`
	Created             string                                 `json:"created"`
	Dns1                string                                 `json:"dns1"`
	Dns2                string                                 `json:"dns2"`
	Domain              string                                 `json:"domain"`
	Domainid            string                                 `json:"domainid"`
	Gateway             string                                 `json:"gateway"`
	Guestipaddress      string                                 `json:"guestipaddress"`
	Guestmacaddress     string                                 `json:"guestmacaddress"`
	Guestnetmask        string                                 `json:"guestnetmask"`
	Guestnetworkid      string                                 `json:"guestnetworkid"`
	Guestnetworkname    string                                 `json:"guestnetworkname"`
	Hasannotations      bool                                   `json:"hasannotations"`
	Healthcheckresults  []StopRouterResponseHealthcheckresults `json:"healthcheckresults"`
	Healthchecksfailed  bool                                   `json:"healthchecksfailed"`
	Hostid              string                                 `json:"hostid"`
	Hostname            string                                 `json:"hostname"`
	Hypervisor          string                                 `json:"hypervisor"`
	Id                  string                                 `json:"id"`
	Ip6dns1             string                                 `json:"ip6dns1"`
	Ip6dns2             string                                 `json:"ip6dns2"`
	Isredundantrouter   bool                                   `json:"isredundantrouter"`
	JobID               string                                 `json:"jobid"`
	Jobstatus           int                                    `json:"jobstatus"`
	Linklocalip         string                                 `json:"linklocalip"`
	Linklocalmacaddress string                                 `json:"linklocalmacaddress"`
	Linklocalnetmask    string                                 `json:"linklocalnetmask"`
	Linklocalnetworkid  string                                 `json:"linklocalnetworkid"`
	Name                string                                 `json:"name"`
	Networkdomain       string                                 `json:"networkdomain"`
	Nic                 []Nic                                  `json:"nic"`
	Podid               string                                 `json:"podid"`
	Podname             string                                 `json:"podname"`
	Project             string                                 `json:"project"`
	Projectid           string                                 `json:"projectid"`
	Publicip            string                                 `json:"publicip"`
	Publicmacaddress    string                                 `json:"publicmacaddress"`
	Publicnetmask       string                                 `json:"publicnetmask"`
	Publicnetworkid     string                                 `json:"publicnetworkid"`
	Redundantstate      string                                 `json:"redundantstate"`
	Requiresupgrade     bool                                   `json:"requiresupgrade"`
	Role                string                                 `json:"role"`
	Scriptsversion      string                                 `json:"scriptsversion"`
	Serviceofferingid   string                                 `json:"serviceofferingid"`
	Serviceofferingname string                                 `json:"serviceofferingname"`
	State               string                                 `json:"state"`
	Templateid          string                                 `json:"templateid"`
	Templatename        string                                 `json:"templatename"`
	Version             string                                 `json:"version"`
	Vpcid               string                                 `json:"vpcid"`
	Vpcname             string                                 `json:"vpcname"`
	Zoneid              string                                 `json:"zoneid"`
	Zonename            string                                 `json:"zonename"`
}

type StopRouterResponseHealthcheckresults struct {
	Checkname   string `json:"checkname"`
	Checktype   string `json:"checktype"`
	Details     string `json:"details"`
	Lastupdated string `json:"lastupdated"`
	Success     bool   `json:"success"`
}
