package gwport

// List of ports
type GatewayPortsList []GatewayPort

// Gateway port information
type GatewayPort struct {
	// Created time
	CreatedAt string `json:"created_at"`

	// Description
	Description string `json:"description"`

	// External L4 port maximum
	ExternalL4PortMax int `json:"external_l4_port_max"`

	// External L4 port minimum
	ExternalL4PortMin int `json:"external_l4_port_min"`

	// External network port
	ExternalNetworkPort ExternalNetworkPort `json:"external_network_port"`

	// ID
	ID string `json:"id"`

	// SNAT enabled flag
	SNATEnabled bool `json:"snat_enabled"`

	// Status information
	Status Status `json:"status"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Version ID
	VersionID uint64 `json:"version_id"`
}

// External network port information
type ExternalNetworkPort struct {
	// Access group ID
	AccessGroupID string `json:"access_group_id"`

	// Access group name
	AccessGroupName string `json:"access_group_name"`

	// Comment
	Comment string `json:"comment"`

	// Display name
	DisplayName string `json:"display_name"`

	// Enabled flag
	Enabled bool `json:"enabled"`

	// IPv4 address
	IPv4 string `json:"ipv4"`

	// IPv6 address
	IPv6 string `json:"ipv6"`

	// IPv6 configuration
	IPv6Config IPv6Config `json:"ipv6_config"`

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

	// Router gateway port
	RouterGatewayPort RouterGatewayPort `json:"router_gateway_port"`

	// Floating IP
	FloatingIP FloatingIP `json:"floating_ip"`
}

// IPv6 configuration information
type IPv6Config struct {
	// Address mode
	AddressMode string `json:"address_mode"`

	// Enable periodic RA flag
	EnablePeriodicRA bool `json:"enable_periodic_ra"`

	// Interval RA
	IntervalRA int `json:"interval_ra"`

	// Router preference
	RouterPreference string `json:"router_preference"`
}

// Router gateway port information
type RouterGatewayPort struct {
	// Created time
	CreatedAt string `json:"created_at"`

	// Description
	Description string `json:"description"`

	// ID
	ID string `json:"id"`

	// Router display name
	RouterDisplayName string `json:"router_display_name"`

	// Router ID
	RouterID string `json:"router_id"`

	// SNAT enabled flag
	SNATEnabled bool `json:"snat_enabled"`

	// Updated time
	UpdatedAt string `json:"updated_at"`
}

// Floating IP information
type FloatingIP struct {
	// Access group ID
	AccessGroupID string `json:"access_group_id"`

	// Access group name
	AccessGroupName string `json:"access_group_name"`

	// Created time
	CreatedAt string `json:"created_at"`

	// External network port
	ExternalNetworkPort string `json:"external_network_port"`

	// ID
	ID string `json:"id"`

	// Logical port
	LogicalPort LogicalPort `json:"logical_port"`

	// Router
	Router string `json:"router"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Version ID
	VersionID uint64 `json:"version_id"`
}

// Logical port information
type LogicalPort struct {
	// ID
	ID string `json:"id"`

	// Access group ID
	AccessGroupID string `json:"access_group_id"`

	// Access group name
	AccessGroupName string `json:"access_group_name"`

	// Adapter MAC
	AdapterMAC string `json:"adapter_mac"`

	// Address detection flag
	AddressDetection bool `json:"address_detection"`

	// Description
	Description string `json:"description"`

	// Created time
	CreatedAt string `json:"created_at"`

	// Display name
	DisplayName string `json:"display_name"`

	// Enabled flag
	Enabled bool `json:"enabled"`

	// External network ID
	ExternalNetworkID string `json:"external_network_id"`

	// Hypervisor
	Hypervisor string `json:"hypervisor"`

	// Hypervisor display name
	HypervisorDisplayName string `json:"hypervisor_display_name"`

	// Live migration target HV
	LiveMigrationTargetHV string `json:"live_migration_target_hv"`

	// Status information
	Status Status `json:"status"`

	// Bindings information
	Bindings Bindings `json:"bindings"`

	// Unique identifier
	UniqueIdentifier string `json:"unique_identifier"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Version ID
	VersionID uint64 `json:"version_id"`
}

// Status information
type Status struct {
	// Common status
	Common string `json:"common"`

	// Hypervisors status list
	Hypervisors []HypervisorStatus `json:"hypervisors"`
}

// Hypervisor status information
type HypervisorStatus struct {
	// Status
	Status string `json:"status"`

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

	// Display name
	DisplayName string `json:"display_name"`

	// Hypervisor status
	HypervisorStatus string `json:"hypervisor_status"`

	// Synced at time
	SyncedAt string `json:"synced_at"`
}

// Bindings information
type Bindings struct {
	// ID
	ID string `json:"id"`

	// Segment display name
	SegmentDisplayName string `json:"segment_display_name"`

	// Segment ID
	SegmentID string `json:"segment_id"`

	// Port security flag
	PortSecurity bool `json:"port_security"`

	// Address detection flag
	AddressDetection bool `json:"address_detection"`

	// Is excluded from firewall flag
	IsExcludedFromFirewall bool `json:"is_excluded_from_firewall"`

	// Version ID
	VersionID uint64 `json:"version_id"`

	// Created time
	CreatedAt string `json:"created_at"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Logical port addresses list
	LogicalPortAddresses []LogicalPortAddress `json:"logical_port_addresses"`
}

// Logical port address information
type LogicalPortAddress struct {
	// IP address
	IP string `json:"ip"`

	// IP type
	IPType string `json:"ip_type"`

	// Is discovered flag
	IsDiscovered bool `json:"is_discovered"`

	// Is primary flag
	IsPrimary bool `json:"is_primary"`

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

	// ID
	ID string `json:"id"`

	// Logical port ID
	LogicalPortID string `json:"logical_port_id"`

	// Assigned at time
	AssignedAt string `json:"assigned_at"`
}

// Policy information
type Policy struct {
	// Action
	Action string `json:"action"`

	// Created time
	CreatedAt string `json:"created_at"`

	// Display name
	DisplayName string `json:"display_name"`

	// Enabled flag
	Enabled bool `json:"enabled"`

	// ID
	ID string `json:"id"`

	// Match criteria
	Match map[string]interface{} `json:"match"`

	// Next IPv4 addresses list
	NextIPv4Address []string `json:"next_ipv4_address"`

	// Next IPv6 addresses list
	NextIPv6Address []string `json:"next_ipv6_address"`

	// Priority
	Priority int `json:"priority"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Version ID
	VersionID uint64 `json:"version_id"`
}

// Port information
type Port struct {
	// Created time
	CreatedAt string `json:"created_at"`

	// Description
	Description string `json:"description"`

	// Enabled flag
	Enabled bool `json:"enabled"`

	// ID
	ID string `json:"id"`

	// IPv4 address
	IPv4Address string `json:"ipv4_address"`

	// IPv6 address
	IPv6Address string `json:"ipv6_address"`

	// IPv6 configuration
	IPv6Config IPv6Config `json:"ipv6_config"`

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

	// Segment information
	Segment Segment `json:"segment"`

	// Segment ID
	SegmentID string `json:"segment_id"`

	// Status information
	Status Status `json:"status"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Version ID
	VersionID uint64 `json:"version_id"`
}

// Segment information
type Segment struct {
	// Access group ID
	AccessGroupID string `json:"access_group_id"`

	// Access group name
	AccessGroupName string `json:"access_group_name"`

	// Created time
	CreatedAt string `json:"created_at"`

	// Description
	Description string `json:"description"`

	// DHCPv4 configuration
	DHCPv4 DHCPv4 `json:"dhcp_v4"`

	// DHCPv6 configuration
	DHCPv6 DHCPv6 `json:"dhcp_v6"`

	// Display name
	DisplayName string `json:"display_name"`

	// Enabled flag
	Enabled bool `json:"enabled"`

	// ID
	ID string `json:"id"`

	// Logical ports info list
	LogicalPortsInfo []LogicalPortInfo `json:"logical_ports_info"`

	// Routers info list
	RoutersInfo []RouterInfo `json:"routers_info"`

	// Status information
	Status Status `json:"status"`

	// IPv4 subnet
	SubnetV4 string `json:"subnet_v4"`

	// IPv6 subnet
	SubnetV6 string `json:"subnet_v6"`

	// Updated time
	UpdatedAt string `json:"updated_at"`

	// Version ID
	VersionID uint64 `json:"version_id"`
}

// DHCPv4 configuration
type DHCPv4 struct {
	// DNS servers list
	DNS []string `json:"dns"`

	// Excluded address ranges list
	ExcludedAddressRanges []string `json:"excluded_address_ranges"`

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

	// ID
	ID string `json:"id"`

	// Lease time
	LeaseTime int `json:"lease_time"`

	// Server IP
	ServerIP string `json:"server_ip"`

	// Server MAC
	ServerMAC string `json:"server_mac"`

	// Enabled flag
	Enabled bool `json:"enabled"`
}

// DHCPv6 configuration
type DHCPv6 struct {
	// Address prefix
	AddressPrefix string `json:"address_prefix"`

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

	// ID
	ID string `json:"id"`

	// Lease time
	LeaseTime int `json:"lease_time"`

	// Server MAC
	ServerMAC string `json:"server_mac"`

	// Enabled flag
	Enabled bool `json:"enabled"`
}

// Logical port info
type LogicalPortInfo struct {
	// Display name
	DisplayName string `json:"display_name"`

	// ID
	ID string `json:"id"`
}

// Router info
type RouterInfo struct {
	// Display name
	DisplayName string `json:"display_name"`

	// ID
	ID string `json:"id"`
}
