package models

import (
	"net"
	"time"

	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)

// ProxyAction - type for proxy action
type ProxyAction string

const (
	// default proxy port
	NmProxyPort = 51722
	// PersistentKeepaliveInterval - default keepalive for wg peer
	DefaultPersistentKeepaliveInterval = time.Duration(time.Second * 20)

	// ProxyUpdate - constant for proxy update action
	ProxyUpdate ProxyAction = "PROXY_UPDATE"
	// ProxyDeletePeers - constant for proxy delete peers action
	ProxyDeletePeers ProxyAction = "PROXY_DELETE"
	// ProxyDeleteAllPeers - constant for proxy delete all peers action
	ProxyDeleteAllPeers ProxyAction = "PROXY_DELETE_ALL"
	// NoProxy - constant for no ProxyAction
	NoProxy ProxyAction = "NO_PROXY"
)

// RelayedConf - struct relayed peers config
type RelayedConf struct {
	RelayedPeerEndpoint *net.UDPAddr         `json:"relayed_peer_endpoint"`
	RelayedPeerPubKey   string               `json:"relayed_peer_pub_key"`
	Peers               []wgtypes.PeerConfig `json:"relayed_peers"`
}

// PeerConf - struct for peer config in the network
type PeerConf struct {
	Proxy            bool         `json:"proxy"`
	PublicListenPort int32        `json:"public_listen_port"`
	IsExtClient      bool         `json:"is_ext_client"`
	Address          net.IP       `json:"address"`
	ExtInternalIp    net.IP       `json:"ext_internal_ip"`
	IsRelayed        bool         `json:"is_relayed"`
	RelayedTo        *net.UDPAddr `json:"relayed_to"`
}

// ProxyManagerPayload - struct for proxy manager payload
type ProxyManagerPayload struct {
	Action        ProxyAction `json:"action"`
	InterfaceName string      `json:"interface_name"`
	Server        string      `json:"server"`
	//WgAddr          string                 `json:"wg_addr"`
	Peers           []wgtypes.PeerConfig   `json:"peers"`
	PeerMap         map[string]PeerConf    `json:"peer_map"`
	IsIngress       bool                   `json:"is_ingress"`
	IsRelayed       bool                   `json:"is_relayed"`
	RelayedTo       *net.UDPAddr           `json:"relayed_to"`
	IsRelay         bool                   `json:"is_relay"`
	RelayedPeerConf map[string]RelayedConf `json:"relayed_conf"`
}

// Metric - struct for metric data
type ProxyMetric struct {
	NodeConnectionStatus map[string]bool `json:"node_connection_status"`
	LastRecordedLatency  uint64          `json:"last_recorded_latency"`
	TrafficSent          int64           `json:"traffic_sent"`     // stored in MB
	TrafficRecieved      int64           `json:"traffic_recieved"` // stored in MB
}
