package segments

import "time"

// List segments
type ListSegment []SegmentResponse

// Main information about network segment
type SegmentResponse struct {
	// Access group ID
	AccessGroupID string `json:"access_group_id"`

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

	// Created time
	CreatedAt time.Time `json:"created_at"`

	// Detailed description of the segment
	Description string `json:"description"`

	// DHCP IPv4
	DHCPv4 DHCPv4Config `json:"dhcp_v4"`

	// DHCP IPv6
	DHCPv6 DHCPv6Config `json:"dhcp_v6"`

	// User-friendly name for the segment
	DisplayName string `json:"display_name"`

	// Whether the segment is enabled
	Enabled bool `json:"enabled"`

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

	// L2 connection port info
	L2ConnectionPort *L2ConnectionPort `json:"l2_connection_port,omitempty"`

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

	// Routers info
	RoutersInfo []EntityInfo `json:"routers_info"`

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

	// IPv4 subnet in CIDR notation
	SubnetV4 string `json:"subnet_v4"`

	// IPv6 subnet in CIDR notation
	SubnetV6 string `json:"subnet_v6"`

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

	// Update time
	UpdatedAt time.Time `json:"updated_at"`

	// ID of version
	VersionID uint64 `json:"version_id"`
}

type DHCPv4Config struct {
	// DNS
	DNS []string `json:"dns"`

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

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

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

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

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

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

	// Whether the config is enabled
	Enabled bool `json:"enabled"`
}

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

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

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

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

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

	// Whether the config is enabled
	Enabled bool `json:"enabled"`
}

type EntityInfo struct {
	// User-friendly name for entity
	DisplayName string `json:"display_name"`

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

type Status struct {
	// Operation status
	OperationStatus string `json:"operation_status"`

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

type HypervisorStatus struct {
	// Operation status of the hypervisor
	OperationStatus string `json:"operation_status"`

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

	// User-friendly name for the hypervisor
	DisplayName string `json:"display_name"`

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

	// Synced time
	SyncedAt time.Time `json:"synced_at"`
}

// L2ConnectionPort holds information about the L2 connection port of a segment
type L2ConnectionPort struct {
	// ID of the L2 connection port
	ID string `json:"id"`

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

	// ID of version
	VersionID uint64 `json:"version_id"`

	// L2 external network details
	L2ExternalNetwork L2ExternalNetwork `json:"l2_external_network"`

	// Created time
	CreatedAt time.Time `json:"created_at"`

	// ID of the user who created the port
	CreatedBy string `json:"created_by"`

	// Updated time
	UpdatedAt time.Time `json:"updated_at"`

	// ID of the user who last updated the port
	UpdatedBy string `json:"updated_by"`
}

// L2ExternalNetwork holds information about an L2 external network
type L2ExternalNetwork struct {
	// ID of the network
	ID string `json:"id"`

	// User-friendly name for the network
	DisplayName string `json:"display_name"`

	// Detailed description of the network
	Description string `json:"description"`

	// Bridge network name
	BridgeNetworkName string `json:"bridge_network_name"`

	// List of hypervisor IDs attached to the network
	Hypervisors []string `json:"hypervisors"`

	// VLAN tag
	VLANTag uint64 `json:"vlan_tag"`

	// ID of version
	VersionID uint64 `json:"version_id"`

	// Created time
	CreatedAt time.Time `json:"created_at"`

	// ID of the user who created the network
	CreatedBy string `json:"created_by"`

	// Updated time
	UpdatedAt time.Time `json:"updated_at"`

	// ID of the user who last updated the network
	UpdatedBy string `json:"updated_by"`
}

// GetFAAResponse holds the floating/anycast IP address info for a segment
type GetFAAResponse struct {
	// IPv4 address
	IPv4Address string `json:"ipv4_address"`

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