//
// Copyright 2018, Sander van Harmelen
//
// 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 cloudstack

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

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

func (p *AttachIsoParams) 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["virtualmachineid"]; found {
		u.Set("virtualmachineid", v.(string))
	}
	return u
}

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

func (p *AttachIsoParams) SetVirtualmachineid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["virtualmachineid"] = v
	return
}

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

// Attaches an ISO to a virtual machine.
func (s *ISOService) AttachIso(p *AttachIsoParams) (*AttachIsoResponse, error) {
	resp, err := s.cs.newRequest("attachIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r AttachIsoResponse
	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 AttachIsoResponse struct {
	JobID         string `json:"jobid"`
	Account       string `json:"account"`
	Affinitygroup []struct {
		Account           string   `json:"account"`
		Description       string   `json:"description"`
		Domain            string   `json:"domain"`
		Domainid          string   `json:"domainid"`
		Id                string   `json:"id"`
		Name              string   `json:"name"`
		Project           string   `json:"project"`
		Projectid         string   `json:"projectid"`
		Type              string   `json:"type"`
		VirtualmachineIds []string `json:"virtualmachineIds"`
	} `json:"affinitygroup"`
	Cpunumber             int               `json:"cpunumber"`
	Cpuspeed              int               `json:"cpuspeed"`
	Cpuused               string            `json:"cpuused"`
	Created               string            `json:"created"`
	Details               map[string]string `json:"details"`
	Diskioread            int64             `json:"diskioread"`
	Diskiowrite           int64             `json:"diskiowrite"`
	Diskkbsread           int64             `json:"diskkbsread"`
	Diskkbswrite          int64             `json:"diskkbswrite"`
	Diskofferingid        string            `json:"diskofferingid"`
	Diskofferingname      string            `json:"diskofferingname"`
	Displayname           string            `json:"displayname"`
	Displayvm             bool              `json:"displayvm"`
	Domain                string            `json:"domain"`
	Domainid              string            `json:"domainid"`
	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
	Group                 string            `json:"group"`
	Groupid               string            `json:"groupid"`
	Guestosid             string            `json:"guestosid"`
	Haenable              bool              `json:"haenable"`
	Hostid                string            `json:"hostid"`
	Hostname              string            `json:"hostname"`
	Hypervisor            string            `json:"hypervisor"`
	Id                    string            `json:"id"`
	Instancename          string            `json:"instancename"`
	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
	Isodisplaytext        string            `json:"isodisplaytext"`
	Isoid                 string            `json:"isoid"`
	Isoname               string            `json:"isoname"`
	Keypair               string            `json:"keypair"`
	Memory                int               `json:"memory"`
	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
	Memorykbs             int64             `json:"memorykbs"`
	Memorytargetkbs       int64             `json:"memorytargetkbs"`
	Name                  string            `json:"name"`
	Networkkbsread        int64             `json:"networkkbsread"`
	Networkkbswrite       int64             `json:"networkkbswrite"`
	Nic                   []struct {
		Broadcasturi         string `json:"broadcasturi"`
		Deviceid             string `json:"deviceid"`
		Gateway              string `json:"gateway"`
		Id                   string `json:"id"`
		Ip6address           string `json:"ip6address"`
		Ip6cidr              string `json:"ip6cidr"`
		Ip6gateway           string `json:"ip6gateway"`
		Ipaddress            string `json:"ipaddress"`
		Isdefault            bool   `json:"isdefault"`
		Isolationuri         string `json:"isolationuri"`
		Macaddress           string `json:"macaddress"`
		Netmask              string `json:"netmask"`
		Networkid            string `json:"networkid"`
		Networkname          string `json:"networkname"`
		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
		Secondaryip          []struct {
			Id        string `json:"id"`
			Ipaddress string `json:"ipaddress"`
		} `json:"secondaryip"`
		Traffictype      string `json:"traffictype"`
		Type             string `json:"type"`
		Virtualmachineid string `json:"virtualmachineid"`
	} `json:"nic"`
	Ostypeid        int64  `json:"ostypeid"`
	Password        string `json:"password"`
	Passwordenabled bool   `json:"passwordenabled"`
	Project         string `json:"project"`
	Projectid       string `json:"projectid"`
	Publicip        string `json:"publicip"`
	Publicipid      string `json:"publicipid"`
	Rootdeviceid    int64  `json:"rootdeviceid"`
	Rootdevicetype  string `json:"rootdevicetype"`
	Securitygroup   []struct {
		Account     string `json:"account"`
		Description string `json:"description"`
		Domain      string `json:"domain"`
		Domainid    string `json:"domainid"`
		Egressrule  []struct {
			Account           string `json:"account"`
			Cidr              string `json:"cidr"`
			Endport           int    `json:"endport"`
			Icmpcode          int    `json:"icmpcode"`
			Icmptype          int    `json:"icmptype"`
			Protocol          string `json:"protocol"`
			Ruleid            string `json:"ruleid"`
			Securitygroupname string `json:"securitygroupname"`
			Startport         int    `json:"startport"`
			Tags              []struct {
				Account      string `json:"account"`
				Customer     string `json:"customer"`
				Domain       string `json:"domain"`
				Domainid     string `json:"domainid"`
				Key          string `json:"key"`
				Project      string `json:"project"`
				Projectid    string `json:"projectid"`
				Resourceid   string `json:"resourceid"`
				Resourcetype string `json:"resourcetype"`
				Value        string `json:"value"`
			} `json:"tags"`
		} `json:"egressrule"`
		Id          string `json:"id"`
		Ingressrule []struct {
			Account           string `json:"account"`
			Cidr              string `json:"cidr"`
			Endport           int    `json:"endport"`
			Icmpcode          int    `json:"icmpcode"`
			Icmptype          int    `json:"icmptype"`
			Protocol          string `json:"protocol"`
			Ruleid            string `json:"ruleid"`
			Securitygroupname string `json:"securitygroupname"`
			Startport         int    `json:"startport"`
			Tags              []struct {
				Account      string `json:"account"`
				Customer     string `json:"customer"`
				Domain       string `json:"domain"`
				Domainid     string `json:"domainid"`
				Key          string `json:"key"`
				Project      string `json:"project"`
				Projectid    string `json:"projectid"`
				Resourceid   string `json:"resourceid"`
				Resourcetype string `json:"resourcetype"`
				Value        string `json:"value"`
			} `json:"tags"`
		} `json:"ingressrule"`
		Name      string `json:"name"`
		Project   string `json:"project"`
		Projectid string `json:"projectid"`
		Tags      []struct {
			Account      string `json:"account"`
			Customer     string `json:"customer"`
			Domain       string `json:"domain"`
			Domainid     string `json:"domainid"`
			Key          string `json:"key"`
			Project      string `json:"project"`
			Projectid    string `json:"projectid"`
			Resourceid   string `json:"resourceid"`
			Resourcetype string `json:"resourcetype"`
			Value        string `json:"value"`
		} `json:"tags"`
		Virtualmachinecount int           `json:"virtualmachinecount"`
		Virtualmachineids   []interface{} `json:"virtualmachineids"`
	} `json:"securitygroup"`
	Serviceofferingid   string `json:"serviceofferingid"`
	Serviceofferingname string `json:"serviceofferingname"`
	Servicestate        string `json:"servicestate"`
	State               string `json:"state"`
	Templatedisplaytext string `json:"templatedisplaytext"`
	Templateid          string `json:"templateid"`
	Templatename        string `json:"templatename"`
	Userid              string `json:"userid"`
	Username            string `json:"username"`
	Vgpu                string `json:"vgpu"`
	Zoneid              string `json:"zoneid"`
	Zonename            string `json:"zonename"`
}

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

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

func (p *CopyIsoParams) SetDestzoneid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["destzoneid"] = v
	return
}

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

func (p *CopyIsoParams) SetSourcezoneid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["sourcezoneid"] = v
	return
}

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

// Copies an iso from one zone to another.
func (s *ISOService) CopyIso(p *CopyIsoParams) (*CopyIsoResponse, error) {
	resp, err := s.cs.newRequest("copyIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r CopyIsoResponse
	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 CopyIsoResponse struct {
	JobID                 string            `json:"jobid"`
	Account               string            `json:"account"`
	Accountid             string            `json:"accountid"`
	Bootable              bool              `json:"bootable"`
	Checksum              string            `json:"checksum"`
	Created               string            `json:"created"`
	CrossZones            bool              `json:"crossZones"`
	Details               map[string]string `json:"details"`
	Displaytext           string            `json:"displaytext"`
	Domain                string            `json:"domain"`
	Domainid              string            `json:"domainid"`
	Format                string            `json:"format"`
	Hostid                string            `json:"hostid"`
	Hostname              string            `json:"hostname"`
	Hypervisor            string            `json:"hypervisor"`
	Id                    string            `json:"id"`
	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
	Isextractable         bool              `json:"isextractable"`
	Isfeatured            bool              `json:"isfeatured"`
	Ispublic              bool              `json:"ispublic"`
	Isready               bool              `json:"isready"`
	Name                  string            `json:"name"`
	Ostypeid              string            `json:"ostypeid"`
	Ostypename            string            `json:"ostypename"`
	Passwordenabled       bool              `json:"passwordenabled"`
	Project               string            `json:"project"`
	Projectid             string            `json:"projectid"`
	Removed               string            `json:"removed"`
	Size                  int64             `json:"size"`
	Sourcetemplateid      string            `json:"sourcetemplateid"`
	Sshkeyenabled         bool              `json:"sshkeyenabled"`
	Status                string            `json:"status"`
	Templatetag           string            `json:"templatetag"`
	Templatetype          string            `json:"templatetype"`
	Zoneid                string            `json:"zoneid"`
	Zonename              string            `json:"zonename"`
}

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

func (p *DeleteIsoParams) 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["zoneid"]; found {
		u.Set("zoneid", v.(string))
	}
	return u
}

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

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

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

// Deletes an ISO file.
func (s *ISOService) DeleteIso(p *DeleteIsoParams) (*DeleteIsoResponse, error) {
	resp, err := s.cs.newRequest("deleteIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r DeleteIsoResponse
	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
		}

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

	return &r, nil
}

type DeleteIsoResponse struct {
	JobID       string `json:"jobid"`
	Displaytext string `json:"displaytext"`
	Success     bool   `json:"success"`
}

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

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

func (p *DetachIsoParams) SetVirtualmachineid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["virtualmachineid"] = v
	return
}

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

// Detaches any ISO file (if any) currently attached to a virtual machine.
func (s *ISOService) DetachIso(p *DetachIsoParams) (*DetachIsoResponse, error) {
	resp, err := s.cs.newRequest("detachIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r DetachIsoResponse
	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 DetachIsoResponse struct {
	JobID         string `json:"jobid"`
	Account       string `json:"account"`
	Affinitygroup []struct {
		Account           string   `json:"account"`
		Description       string   `json:"description"`
		Domain            string   `json:"domain"`
		Domainid          string   `json:"domainid"`
		Id                string   `json:"id"`
		Name              string   `json:"name"`
		Project           string   `json:"project"`
		Projectid         string   `json:"projectid"`
		Type              string   `json:"type"`
		VirtualmachineIds []string `json:"virtualmachineIds"`
	} `json:"affinitygroup"`
	Cpunumber             int               `json:"cpunumber"`
	Cpuspeed              int               `json:"cpuspeed"`
	Cpuused               string            `json:"cpuused"`
	Created               string            `json:"created"`
	Details               map[string]string `json:"details"`
	Diskioread            int64             `json:"diskioread"`
	Diskiowrite           int64             `json:"diskiowrite"`
	Diskkbsread           int64             `json:"diskkbsread"`
	Diskkbswrite          int64             `json:"diskkbswrite"`
	Diskofferingid        string            `json:"diskofferingid"`
	Diskofferingname      string            `json:"diskofferingname"`
	Displayname           string            `json:"displayname"`
	Displayvm             bool              `json:"displayvm"`
	Domain                string            `json:"domain"`
	Domainid              string            `json:"domainid"`
	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
	Group                 string            `json:"group"`
	Groupid               string            `json:"groupid"`
	Guestosid             string            `json:"guestosid"`
	Haenable              bool              `json:"haenable"`
	Hostid                string            `json:"hostid"`
	Hostname              string            `json:"hostname"`
	Hypervisor            string            `json:"hypervisor"`
	Id                    string            `json:"id"`
	Instancename          string            `json:"instancename"`
	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
	Isodisplaytext        string            `json:"isodisplaytext"`
	Isoid                 string            `json:"isoid"`
	Isoname               string            `json:"isoname"`
	Keypair               string            `json:"keypair"`
	Memory                int               `json:"memory"`
	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
	Memorykbs             int64             `json:"memorykbs"`
	Memorytargetkbs       int64             `json:"memorytargetkbs"`
	Name                  string            `json:"name"`
	Networkkbsread        int64             `json:"networkkbsread"`
	Networkkbswrite       int64             `json:"networkkbswrite"`
	Nic                   []struct {
		Broadcasturi         string `json:"broadcasturi"`
		Deviceid             string `json:"deviceid"`
		Gateway              string `json:"gateway"`
		Id                   string `json:"id"`
		Ip6address           string `json:"ip6address"`
		Ip6cidr              string `json:"ip6cidr"`
		Ip6gateway           string `json:"ip6gateway"`
		Ipaddress            string `json:"ipaddress"`
		Isdefault            bool   `json:"isdefault"`
		Isolationuri         string `json:"isolationuri"`
		Macaddress           string `json:"macaddress"`
		Netmask              string `json:"netmask"`
		Networkid            string `json:"networkid"`
		Networkname          string `json:"networkname"`
		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
		Secondaryip          []struct {
			Id        string `json:"id"`
			Ipaddress string `json:"ipaddress"`
		} `json:"secondaryip"`
		Traffictype      string `json:"traffictype"`
		Type             string `json:"type"`
		Virtualmachineid string `json:"virtualmachineid"`
	} `json:"nic"`
	Ostypeid        int64  `json:"ostypeid"`
	Password        string `json:"password"`
	Passwordenabled bool   `json:"passwordenabled"`
	Project         string `json:"project"`
	Projectid       string `json:"projectid"`
	Publicip        string `json:"publicip"`
	Publicipid      string `json:"publicipid"`
	Rootdeviceid    int64  `json:"rootdeviceid"`
	Rootdevicetype  string `json:"rootdevicetype"`
	Securitygroup   []struct {
		Account     string `json:"account"`
		Description string `json:"description"`
		Domain      string `json:"domain"`
		Domainid    string `json:"domainid"`
		Egressrule  []struct {
			Account           string `json:"account"`
			Cidr              string `json:"cidr"`
			Endport           int    `json:"endport"`
			Icmpcode          int    `json:"icmpcode"`
			Icmptype          int    `json:"icmptype"`
			Protocol          string `json:"protocol"`
			Ruleid            string `json:"ruleid"`
			Securitygroupname string `json:"securitygroupname"`
			Startport         int    `json:"startport"`
			Tags              []struct {
				Account      string `json:"account"`
				Customer     string `json:"customer"`
				Domain       string `json:"domain"`
				Domainid     string `json:"domainid"`
				Key          string `json:"key"`
				Project      string `json:"project"`
				Projectid    string `json:"projectid"`
				Resourceid   string `json:"resourceid"`
				Resourcetype string `json:"resourcetype"`
				Value        string `json:"value"`
			} `json:"tags"`
		} `json:"egressrule"`
		Id          string `json:"id"`
		Ingressrule []struct {
			Account           string `json:"account"`
			Cidr              string `json:"cidr"`
			Endport           int    `json:"endport"`
			Icmpcode          int    `json:"icmpcode"`
			Icmptype          int    `json:"icmptype"`
			Protocol          string `json:"protocol"`
			Ruleid            string `json:"ruleid"`
			Securitygroupname string `json:"securitygroupname"`
			Startport         int    `json:"startport"`
			Tags              []struct {
				Account      string `json:"account"`
				Customer     string `json:"customer"`
				Domain       string `json:"domain"`
				Domainid     string `json:"domainid"`
				Key          string `json:"key"`
				Project      string `json:"project"`
				Projectid    string `json:"projectid"`
				Resourceid   string `json:"resourceid"`
				Resourcetype string `json:"resourcetype"`
				Value        string `json:"value"`
			} `json:"tags"`
		} `json:"ingressrule"`
		Name      string `json:"name"`
		Project   string `json:"project"`
		Projectid string `json:"projectid"`
		Tags      []struct {
			Account      string `json:"account"`
			Customer     string `json:"customer"`
			Domain       string `json:"domain"`
			Domainid     string `json:"domainid"`
			Key          string `json:"key"`
			Project      string `json:"project"`
			Projectid    string `json:"projectid"`
			Resourceid   string `json:"resourceid"`
			Resourcetype string `json:"resourcetype"`
			Value        string `json:"value"`
		} `json:"tags"`
		Virtualmachinecount int           `json:"virtualmachinecount"`
		Virtualmachineids   []interface{} `json:"virtualmachineids"`
	} `json:"securitygroup"`
	Serviceofferingid   string `json:"serviceofferingid"`
	Serviceofferingname string `json:"serviceofferingname"`
	Servicestate        string `json:"servicestate"`
	State               string `json:"state"`
	Templatedisplaytext string `json:"templatedisplaytext"`
	Templateid          string `json:"templateid"`
	Templatename        string `json:"templatename"`
	Userid              string `json:"userid"`
	Username            string `json:"username"`
	Vgpu                string `json:"vgpu"`
	Zoneid              string `json:"zoneid"`
	Zonename            string `json:"zonename"`
}

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

func (p *ExtractIsoParams) 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["mode"]; found {
		u.Set("mode", v.(string))
	}
	if v, found := p.p["url"]; found {
		u.Set("url", v.(string))
	}
	if v, found := p.p["zoneid"]; found {
		u.Set("zoneid", v.(string))
	}
	return u
}

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

func (p *ExtractIsoParams) SetMode(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["mode"] = v
	return
}

func (p *ExtractIsoParams) SetUrl(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["url"] = v
	return
}

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

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

// Extracts an ISO
func (s *ISOService) ExtractIso(p *ExtractIsoParams) (*ExtractIsoResponse, error) {
	resp, err := s.cs.newRequest("extractIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

	var r ExtractIsoResponse
	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 ExtractIsoResponse struct {
	JobID            string `json:"jobid"`
	Accountid        string `json:"accountid"`
	Created          string `json:"created"`
	ExtractId        string `json:"extractId"`
	ExtractMode      string `json:"extractMode"`
	Id               string `json:"id"`
	Name             string `json:"name"`
	Resultstring     string `json:"resultstring"`
	State            string `json:"state"`
	Status           string `json:"status"`
	Storagetype      string `json:"storagetype"`
	Uploadpercentage int    `json:"uploadpercentage"`
	Url              string `json:"url"`
	Zoneid           string `json:"zoneid"`
	Zonename         string `json:"zonename"`
}

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

func (p *ListIsoPermissionsParams) 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 *ListIsoPermissionsParams) SetId(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["id"] = v
	return
}

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

// This is a courtesy helper function, which in some cases may not work as expected!
func (s *ISOService) GetIsoPermissionByID(id string, opts ...OptionFunc) (*IsoPermission, int, error) {
	p := &ListIsoPermissionsParams{}
	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.ListIsoPermissions(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.IsoPermissions[0], l.Count, nil
	}
	return nil, l.Count, fmt.Errorf("There is more then one result for IsoPermission UUID: %s!", id)
}

// List ISO visibility and all accounts that have permissions to view this ISO.
func (s *ISOService) ListIsoPermissions(p *ListIsoPermissionsParams) (*ListIsoPermissionsResponse, error) {
	resp, err := s.cs.newRequest("listIsoPermissions", p.toURLValues())
	if err != nil {
		return nil, err
	}

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

	return &r, nil
}

type ListIsoPermissionsResponse struct {
	Count          int              `json:"count"`
	IsoPermissions []*IsoPermission `json:"isopermission"`
}

type IsoPermission struct {
	Account    []string `json:"account"`
	Domainid   string   `json:"domainid"`
	Id         string   `json:"id"`
	Ispublic   bool     `json:"ispublic"`
	Projectids []string `json:"projectids"`
}

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

func (p *ListIsosParams) 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["bootable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("bootable", vv)
	}
	if v, found := p.p["domainid"]; found {
		u.Set("domainid", v.(string))
	}
	if v, found := p.p["hypervisor"]; found {
		u.Set("hypervisor", v.(string))
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	if v, found := p.p["isofilter"]; found {
		u.Set("isofilter", v.(string))
	}
	if v, found := p.p["ispublic"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("ispublic", vv)
	}
	if v, found := p.p["isready"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isready", vv)
	}
	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["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["projectid"]; found {
		u.Set("projectid", v.(string))
	}
	if v, found := p.p["showremoved"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("showremoved", vv)
	}
	if v, found := p.p["tags"]; found {
		i := 0
		for k, vv := range v.(map[string]string) {
			u.Set(fmt.Sprintf("tags[%d].key", i), k)
			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
			i++
		}
	}
	if v, found := p.p["zoneid"]; found {
		u.Set("zoneid", v.(string))
	}
	return u
}

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

func (p *ListIsosParams) SetBootable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["bootable"] = v
	return
}

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

func (p *ListIsosParams) SetHypervisor(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["hypervisor"] = v
	return
}

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

func (p *ListIsosParams) SetIsofilter(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isofilter"] = v
	return
}

func (p *ListIsosParams) SetIspublic(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["ispublic"] = v
	return
}

func (p *ListIsosParams) SetIsready(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isready"] = v
	return
}

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

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

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

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

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

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

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

func (p *ListIsosParams) SetShowremoved(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["showremoved"] = v
	return
}

func (p *ListIsosParams) SetTags(v map[string]string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["tags"] = v
	return
}

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

// You should always use this function to get a new ListIsosParams instance,
// as then you are sure you have configured all required params
func (s *ISOService) NewListIsosParams() *ListIsosParams {
	p := &ListIsosParams{}
	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 *ISOService) GetIsoID(name string, isofilter string, zoneid string, opts ...OptionFunc) (string, int, error) {
	p := &ListIsosParams{}
	p.p = make(map[string]interface{})

	p.p["name"] = name
	p.p["isofilter"] = isofilter
	p.p["zoneid"] = zoneid

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

	l, err := s.ListIsos(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.Isos[0].Id, l.Count, nil
	}

	if l.Count > 1 {
		for _, v := range l.Isos {
			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 *ISOService) GetIsoByName(name string, isofilter string, zoneid string, opts ...OptionFunc) (*Iso, int, error) {
	id, count, err := s.GetIsoID(name, isofilter, zoneid, opts...)
	if err != nil {
		return nil, count, err
	}

	r, count, err := s.GetIsoByID(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 *ISOService) GetIsoByID(id string, opts ...OptionFunc) (*Iso, int, error) {
	p := &ListIsosParams{}
	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.ListIsos(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.Isos[0], l.Count, nil
	}
	return nil, l.Count, fmt.Errorf("There is more then one result for Iso UUID: %s!", id)
}

// Lists all available ISO files.
func (s *ISOService) ListIsos(p *ListIsosParams) (*ListIsosResponse, error) {
	resp, err := s.cs.newRequest("listIsos", p.toURLValues())
	if err != nil {
		return nil, err
	}

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

	return &r, nil
}

type ListIsosResponse struct {
	Count int    `json:"count"`
	Isos  []*Iso `json:"iso"`
}

type Iso struct {
	Account               string            `json:"account"`
	Accountid             string            `json:"accountid"`
	Bootable              bool              `json:"bootable"`
	Checksum              string            `json:"checksum"`
	Created               string            `json:"created"`
	CrossZones            bool              `json:"crossZones"`
	Details               map[string]string `json:"details"`
	Displaytext           string            `json:"displaytext"`
	Domain                string            `json:"domain"`
	Domainid              string            `json:"domainid"`
	Format                string            `json:"format"`
	Hostid                string            `json:"hostid"`
	Hostname              string            `json:"hostname"`
	Hypervisor            string            `json:"hypervisor"`
	Id                    string            `json:"id"`
	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
	Isextractable         bool              `json:"isextractable"`
	Isfeatured            bool              `json:"isfeatured"`
	Ispublic              bool              `json:"ispublic"`
	Isready               bool              `json:"isready"`
	Name                  string            `json:"name"`
	Ostypeid              string            `json:"ostypeid"`
	Ostypename            string            `json:"ostypename"`
	Passwordenabled       bool              `json:"passwordenabled"`
	Project               string            `json:"project"`
	Projectid             string            `json:"projectid"`
	Removed               string            `json:"removed"`
	Size                  int64             `json:"size"`
	Sourcetemplateid      string            `json:"sourcetemplateid"`
	Sshkeyenabled         bool              `json:"sshkeyenabled"`
	Status                string            `json:"status"`
	Templatetag           string            `json:"templatetag"`
	Templatetype          string            `json:"templatetype"`
	Zoneid                string            `json:"zoneid"`
	Zonename              string            `json:"zonename"`
}

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

func (p *RegisterIsoParams) 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["bootable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("bootable", vv)
	}
	if v, found := p.p["checksum"]; found {
		u.Set("checksum", v.(string))
	}
	if v, found := p.p["displaytext"]; found {
		u.Set("displaytext", v.(string))
	}
	if v, found := p.p["domainid"]; found {
		u.Set("domainid", v.(string))
	}
	if v, found := p.p["imagestoreuuid"]; found {
		u.Set("imagestoreuuid", v.(string))
	}
	if v, found := p.p["isdynamicallyscalable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isdynamicallyscalable", vv)
	}
	if v, found := p.p["isextractable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isextractable", vv)
	}
	if v, found := p.p["isfeatured"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isfeatured", vv)
	}
	if v, found := p.p["ispublic"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("ispublic", vv)
	}
	if v, found := p.p["name"]; found {
		u.Set("name", v.(string))
	}
	if v, found := p.p["ostypeid"]; found {
		u.Set("ostypeid", v.(string))
	}
	if v, found := p.p["projectid"]; found {
		u.Set("projectid", v.(string))
	}
	if v, found := p.p["url"]; found {
		u.Set("url", v.(string))
	}
	if v, found := p.p["zoneid"]; found {
		u.Set("zoneid", v.(string))
	}
	return u
}

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

func (p *RegisterIsoParams) SetBootable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["bootable"] = v
	return
}

func (p *RegisterIsoParams) SetChecksum(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["checksum"] = v
	return
}

func (p *RegisterIsoParams) SetDisplaytext(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["displaytext"] = v
	return
}

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

func (p *RegisterIsoParams) SetImagestoreuuid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["imagestoreuuid"] = v
	return
}

func (p *RegisterIsoParams) SetIsdynamicallyscalable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isdynamicallyscalable"] = v
	return
}

func (p *RegisterIsoParams) SetIsextractable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isextractable"] = v
	return
}

func (p *RegisterIsoParams) SetIsfeatured(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isfeatured"] = v
	return
}

func (p *RegisterIsoParams) SetIspublic(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["ispublic"] = v
	return
}

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

func (p *RegisterIsoParams) SetOstypeid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["ostypeid"] = v
	return
}

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

func (p *RegisterIsoParams) SetUrl(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["url"] = v
	return
}

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

// You should always use this function to get a new RegisterIsoParams instance,
// as then you are sure you have configured all required params
func (s *ISOService) NewRegisterIsoParams(displaytext string, name string, url string, zoneid string) *RegisterIsoParams {
	p := &RegisterIsoParams{}
	p.p = make(map[string]interface{})
	p.p["displaytext"] = displaytext
	p.p["name"] = name
	p.p["url"] = url
	p.p["zoneid"] = zoneid
	return p
}

// Registers an existing ISO into the CloudStack Cloud.
func (s *ISOService) RegisterIso(p *RegisterIsoParams) (*RegisterIsoResponse, error) {
	resp, err := s.cs.newRequest("registerIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

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

	return &r, nil
}

type RegisterIsoResponse struct {
	Account               string            `json:"account"`
	Accountid             string            `json:"accountid"`
	Bootable              bool              `json:"bootable"`
	Checksum              string            `json:"checksum"`
	Created               string            `json:"created"`
	CrossZones            bool              `json:"crossZones"`
	Details               map[string]string `json:"details"`
	Displaytext           string            `json:"displaytext"`
	Domain                string            `json:"domain"`
	Domainid              string            `json:"domainid"`
	Format                string            `json:"format"`
	Hostid                string            `json:"hostid"`
	Hostname              string            `json:"hostname"`
	Hypervisor            string            `json:"hypervisor"`
	Id                    string            `json:"id"`
	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
	Isextractable         bool              `json:"isextractable"`
	Isfeatured            bool              `json:"isfeatured"`
	Ispublic              bool              `json:"ispublic"`
	Isready               bool              `json:"isready"`
	Name                  string            `json:"name"`
	Ostypeid              string            `json:"ostypeid"`
	Ostypename            string            `json:"ostypename"`
	Passwordenabled       bool              `json:"passwordenabled"`
	Project               string            `json:"project"`
	Projectid             string            `json:"projectid"`
	Removed               string            `json:"removed"`
	Size                  int64             `json:"size"`
	Sourcetemplateid      string            `json:"sourcetemplateid"`
	Sshkeyenabled         bool              `json:"sshkeyenabled"`
	Status                string            `json:"status"`
	Templatetag           string            `json:"templatetag"`
	Templatetype          string            `json:"templatetype"`
	Zoneid                string            `json:"zoneid"`
	Zonename              string            `json:"zonename"`
}

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

func (p *UpdateIsoParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["bootable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("bootable", vv)
	}
	if v, found := p.p["details"]; found {
		i := 0
		for k, vv := range v.(map[string]string) {
			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
			i++
		}
	}
	if v, found := p.p["displaytext"]; found {
		u.Set("displaytext", v.(string))
	}
	if v, found := p.p["format"]; found {
		u.Set("format", v.(string))
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	if v, found := p.p["isdynamicallyscalable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isdynamicallyscalable", vv)
	}
	if v, found := p.p["isrouting"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isrouting", vv)
	}
	if v, found := p.p["name"]; found {
		u.Set("name", v.(string))
	}
	if v, found := p.p["ostypeid"]; found {
		u.Set("ostypeid", v.(string))
	}
	if v, found := p.p["passwordenabled"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("passwordenabled", vv)
	}
	if v, found := p.p["requireshvm"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("requireshvm", vv)
	}
	if v, found := p.p["sortkey"]; found {
		vv := strconv.Itoa(v.(int))
		u.Set("sortkey", vv)
	}
	return u
}

func (p *UpdateIsoParams) SetBootable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["bootable"] = v
	return
}

func (p *UpdateIsoParams) SetDetails(v map[string]string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["details"] = v
	return
}

func (p *UpdateIsoParams) SetDisplaytext(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["displaytext"] = v
	return
}

func (p *UpdateIsoParams) SetFormat(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["format"] = v
	return
}

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

func (p *UpdateIsoParams) SetIsdynamicallyscalable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isdynamicallyscalable"] = v
	return
}

func (p *UpdateIsoParams) SetIsrouting(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isrouting"] = v
	return
}

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

func (p *UpdateIsoParams) SetOstypeid(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["ostypeid"] = v
	return
}

func (p *UpdateIsoParams) SetPasswordenabled(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["passwordenabled"] = v
	return
}

func (p *UpdateIsoParams) SetRequireshvm(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["requireshvm"] = v
	return
}

func (p *UpdateIsoParams) SetSortkey(v int) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["sortkey"] = v
	return
}

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

// Updates an ISO file.
func (s *ISOService) UpdateIso(p *UpdateIsoParams) (*UpdateIsoResponse, error) {
	resp, err := s.cs.newRequest("updateIso", p.toURLValues())
	if err != nil {
		return nil, err
	}

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

	return &r, nil
}

type UpdateIsoResponse struct {
	Account               string            `json:"account"`
	Accountid             string            `json:"accountid"`
	Bootable              bool              `json:"bootable"`
	Checksum              string            `json:"checksum"`
	Created               string            `json:"created"`
	CrossZones            bool              `json:"crossZones"`
	Details               map[string]string `json:"details"`
	Displaytext           string            `json:"displaytext"`
	Domain                string            `json:"domain"`
	Domainid              string            `json:"domainid"`
	Format                string            `json:"format"`
	Hostid                string            `json:"hostid"`
	Hostname              string            `json:"hostname"`
	Hypervisor            string            `json:"hypervisor"`
	Id                    string            `json:"id"`
	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
	Isextractable         bool              `json:"isextractable"`
	Isfeatured            bool              `json:"isfeatured"`
	Ispublic              bool              `json:"ispublic"`
	Isready               bool              `json:"isready"`
	Name                  string            `json:"name"`
	Ostypeid              string            `json:"ostypeid"`
	Ostypename            string            `json:"ostypename"`
	Passwordenabled       bool              `json:"passwordenabled"`
	Project               string            `json:"project"`
	Projectid             string            `json:"projectid"`
	Removed               string            `json:"removed"`
	Size                  int64             `json:"size"`
	Sourcetemplateid      string            `json:"sourcetemplateid"`
	Sshkeyenabled         bool              `json:"sshkeyenabled"`
	Status                string            `json:"status"`
	Templatetag           string            `json:"templatetag"`
	Templatetype          string            `json:"templatetype"`
	Zoneid                string            `json:"zoneid"`
	Zonename              string            `json:"zonename"`
}

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

func (p *UpdateIsoPermissionsParams) toURLValues() url.Values {
	u := url.Values{}
	if p.p == nil {
		return u
	}
	if v, found := p.p["accounts"]; found {
		vv := strings.Join(v.([]string), ",")
		u.Set("accounts", vv)
	}
	if v, found := p.p["id"]; found {
		u.Set("id", v.(string))
	}
	if v, found := p.p["isextractable"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isextractable", vv)
	}
	if v, found := p.p["isfeatured"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("isfeatured", vv)
	}
	if v, found := p.p["ispublic"]; found {
		vv := strconv.FormatBool(v.(bool))
		u.Set("ispublic", vv)
	}
	if v, found := p.p["op"]; found {
		u.Set("op", v.(string))
	}
	if v, found := p.p["projectids"]; found {
		vv := strings.Join(v.([]string), ",")
		u.Set("projectids", vv)
	}
	return u
}

func (p *UpdateIsoPermissionsParams) SetAccounts(v []string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["accounts"] = v
	return
}

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

func (p *UpdateIsoPermissionsParams) SetIsextractable(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isextractable"] = v
	return
}

func (p *UpdateIsoPermissionsParams) SetIsfeatured(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["isfeatured"] = v
	return
}

func (p *UpdateIsoPermissionsParams) SetIspublic(v bool) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["ispublic"] = v
	return
}

func (p *UpdateIsoPermissionsParams) SetOp(v string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["op"] = v
	return
}

func (p *UpdateIsoPermissionsParams) SetProjectids(v []string) {
	if p.p == nil {
		p.p = make(map[string]interface{})
	}
	p.p["projectids"] = v
	return
}

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

// Updates ISO permissions
func (s *ISOService) UpdateIsoPermissions(p *UpdateIsoPermissionsParams) (*UpdateIsoPermissionsResponse, error) {
	resp, err := s.cs.newRequest("updateIsoPermissions", p.toURLValues())
	if err != nil {
		return nil, err
	}

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

	return &r, nil
}

type UpdateIsoPermissionsResponse struct {
	Displaytext string `json:"displaytext"`
	Success     string `json:"success"`
}
