package models

import (
	"net/netip"
)

type Connection struct {
	// Type is the connection type and can be "openvpn" or "wireguard"
	Type string `json:"type"`
	// IP is the VPN server IP address.
	IP netip.Addr `json:"ip"`
	// Port is the VPN server port.
	Port uint16 `json:"port"`
	// Protocol can be "tcp" or "udp".
	Protocol string `json:"protocol"`
	// Hostname is used for IPVanish, IVPN, Privado
	// and Windscribe for TLS verification.
	Hostname string `json:"hostname"`
	// ServerName is used for PIA for port forwarding
	ServerName string `json:"server_name,omitempty"`
	// PubKey is the public key of the VPN server,
	// used only for Wireguard.
	PubKey string `json:"pubkey"`
}

func (c *Connection) Equal(other Connection) bool {
	return c.IP.Compare(other.IP) == 0 && c.Port == other.Port &&
		c.Protocol == other.Protocol && c.Hostname == other.Hostname &&
		c.ServerName == other.ServerName && c.PubKey == other.PubKey
}

// UpdateEmptyWith updates each field of the connection where the
// value is not set using the value given as arguments.
func (c *Connection) UpdateEmptyWith(ip netip.Addr, port uint16, protocol string) {
	if !c.IP.IsValid() {
		c.IP = ip
	}
	if c.Port == 0 {
		c.Port = port
	}
	if c.Protocol == "" {
		c.Protocol = protocol
	}
}
