package extnet

// Main information about external network
type ItemExtNet struct {
	// ID
	ID uint64 `json:"id"`

	// IPCIDR
	IPCIDR string `json:"ipcidr"`

	// Name
	Name string `json:"name"`

	// Status
	Status string `json:"status"`
}

// Extend information about external network
type ItemExtNetExtend struct {
	// Main information about external network
	ItemExtNet

	// IP address
	IPAddr string `json:"ipaddr"`
}

// List of information about external network
type ListExtNets struct {
	Data []ItemExtNet `json:"data"`

	EntryCount uint64 `json:"entryCount"`
}

// List of extend information about external network
type ListExtNetExtends []ItemExtNetExtend

// Main information about compute with external network
type ItemExtNetCompute struct {
	// Account ID
	AccountID uint64 `json:"accountId"`

	// Account name
	AccountName string `json:"accountName"`

	// List of extend information about external network
	ExtNets ListExtNetExtends `json:"extnets"`

	// ID
	ID uint64 `json:"id"`

	// Name
	Name string `json:"name"`

	// Resource group ID
	RGID uint64 `json:"rgId"`

	// Resource group name
	RGName string `json:"rgName"`
}

// List of information about computes with external network
type ListExtNetComputes struct {
	// Data
	Data []ItemExtNetCompute `json:"data"`

	// Entry count
	EntryCount uint64 `json:"entryCount"`
}

// QOS
type QOS struct {
	// EBurst
	EBurst uint64 `json:"eBurst"`

	// ERate
	ERate uint64 `json:"eRate"`

	// GUID
	GUID string `json:"guid"`

	// InBurst
	InBurst uint64 `json:"inBurst"`

	// InRate
	InRate uint64 `json:"inRate"`
}

// Main information about reservations
type ItemReservation struct {
	// Account ID
	AccountID uint64 `json:"account_id"`

	// ClientType
	ClientType string `json:"clientType"`

	// Description
	Description string `json:"desc"`

	// Domain name
	DomainName string `json:"domainname"`

	// Hostname
	Hostname string `json:"hostname"`

	// IP
	IP string `json:"ip"`

	// MAC
	MAC string `json:"mac"`

	// Type
	Type string `json:"type"`

	// Virtual machine ID
	VMID uint64 `json:"vmId"`
}

// List of information about reservations
type ListReservations []ItemReservation

// VNFs
type VNFs struct {
	DHCP uint64 `json:"dhcp"`
}

type Excluded struct {
	// ClientType
	ClientType string `json:"clientType"`

	// Domain name
	DomainName string `json:"domainname"`

	// Host name
	HostName string `json:"hostname"`

	// IP
	IP string `json:"ip"`

	// MAC
	MAC string `json:"mac"`

	// Type
	Type string `json:"type"`

	// VMID
	VMID uint64 `json:"vmId"`
}

// Detailed information about external network
type RecordExtNet struct {
	// CKey
	CKey string `json:"_ckey"`

	// Meta
	Meta []interface{} `json:"_meta"`

	// CheckIps
	CheckIPs []string `json:"checkIps"`

	// Default
	Default bool `json:"default"`

	// Default QOS
	DefaultQOS QOS `json:"defaultQos"`

	// Description
	Description string `json:"desc"`

	// list of DNS
	DNS []string `json:"dns"`

	// Excluded
	Excluded []Excluded `json:"excluded"`

	// Enable Security Groups
	EnableSecGroups bool `json:"enable_secgroups"`

	// Free IPs
	FreeIPs int64 `json:"free_ips"`

	// Gateway
	Gateway string `json:"gateway"`

	// Grid ID
	GID uint64 `json:"gid"`

	// GUID
	GUID uint64 `json:"guid"`

	// ID
	ID uint64 `json:"id"`

	// IPCIDR
	IPCIDR string `json:"ipcidr"`

	// Milestones
	Milestones uint64 `json:"milestones"`

	// MTU
	MTU uint64 `json:"mtu"`

	// Name
	Name string `json:"name"`

	// Network
	Network string `json:"network"`

	// Network IDs
	NetworkIDs NetworkIDs `json:"networkIds"`

	// NTP
	NTP []string `json:"ntp"`

	// OVS Bridge
	OVSBridge string `json:"ovsBridge"`

	// PreReservation IP num
	PreReservationsNum uint64 `json:"preReservationsNum"`

	// Prefix
	Prefix uint64 `json:"prefix"`

	// PriVNFDevID
	PriVNFDevID uint64 `json:"priVnfDevId"`

	// Redundant
	Redundant bool `json:"redundant"`

	// SecVnfDevId
	SecVNFDevID uint64 `json:"secVnfDevId"`

	// List reservations
	Reservations ListReservations `json:"reservations"`

	// List pre-reservations
	PreReservations ListReservations `json:"pre-reservations"`

	// Shared with
	SharedWith []uint64 `json:"sharedWith"`

	// Status
	Status string `json:"status"`

	// VLAN ID
	VLANID uint64 `json:"vlanId"`

	// VNFs
	VNFs VNFs `json:"vnfs"`

	// Zone ID
	ZoneID uint64 `json:"zoneId"`
}

type NetworkIDs struct {
	// Primary
	Primary uint64 `json:"primary"`

	// Secondary
	Secondary uint64 `json:"secondary"`
}

// Detailed information about reserved address or address pool
type RecordReservedIP struct {
	ExtnetID     int            `json:"extnet_id"`
	Reservations []Reservations `json:"reservations"`
}

type Reservations struct {
	AccountID  int    `json:"account_id"`
	ClientType string `json:"clientType"`
	DomainName string `json:"domainname"`
	Hostname   string `json:"hostname"`
	IP         string `json:"ip"`
	Mac        string `json:"mac"`
	Type       string `json:"type"`
	VMID       int    `json:"vmId"`
}
