package dnet

import (
	"context"
	"crypto/ecdsa"
	"net"

	"koti.casa/numenor-labs/dsfx/shared/dlog"
)

// Dial ...
func Dial(
	ctx context.Context,
	laddr *net.TCPAddr,
	raddr *net.TCPAddr,
	clientPrivateKey *ecdsa.PrivateKey,
	serverPublicKey *ecdsa.PublicKey,
) (*Conn, error) {
	conn, err := net.DialTCP("tcp", laddr, raddr)
	if err != nil {
		return nil, err
	}

	sessionKey, err := Handshake(ctx, conn, clientPrivateKey, serverPublicKey)
	if err != nil {
		return nil, err
	}

	return NewConn(conn, sessionKey, &clientPrivateKey.PublicKey, serverPublicKey), nil
}

// Listen ...
func Listen(
	ctx context.Context,
	laddr *net.TCPAddr,
	identity *ecdsa.PrivateKey,
) (net.Listener, error) {
	tcpListener, err := net.ListenTCP("tcp", laddr)
	if err != nil {
		return nil, err
	}

	logger := dlog.FromContext(ctx)

	return &Listener{logger, tcpListener, identity}, nil
}