//go:build linux || darwin || (windows && (amd64 || 386))

package tlsspoof

import (
	"net"
	"net/netip"

	"github.com/sagernet/sing/common"
	E "github.com/sagernet/sing/common/exceptions"
	M "github.com/sagernet/sing/common/metadata"
)

// The returned addresses are v4-unmapped and share the same family.
func tcpEndpoints(conn net.Conn) (*net.TCPConn, netip.AddrPort, netip.AddrPort, error) {
	tcpConn, isTCP := common.Cast[*net.TCPConn](conn)
	if !isTCP {
		return nil, netip.AddrPort{}, netip.AddrPort{}, E.New("tls_spoof: underlying conn is not *net.TCPConn")
	}
	local := M.AddrPortFromNet(tcpConn.LocalAddr())
	remote := M.AddrPortFromNet(tcpConn.RemoteAddr())
	if !local.IsValid() || !remote.IsValid() {
		return nil, netip.AddrPort{}, netip.AddrPort{}, E.New("tls_spoof: invalid conn address")
	}
	local = netip.AddrPortFrom(local.Addr().Unmap(), local.Port())
	remote = netip.AddrPortFrom(remote.Addr().Unmap(), remote.Port())
	if local.Addr().Is4() != remote.Addr().Is4() {
		return nil, netip.AddrPort{}, netip.AddrPort{}, E.New("tls_spoof: local/remote address family mismatch")
	}
	return tcpConn, local, remote, nil
}
