package mocks

import (
	"context"
	"net"
	"time"

	"github.com/ooni/probe-cli/v3/internal/model"
)

// UnderlyingNetwork allows mocking model.UnderlyingNetwork.
type UnderlyingNetwork struct {
	MockDialContext func(ctx context.Context, timeout time.Duration, network, address string) (net.Conn, error)

	MockListenUDP func(network string, addr *net.UDPAddr) (model.UDPLikeConn, error)

	MockGetaddrinfoLookupANY func(ctx context.Context, domain string) ([]string, string, error)

	MockGetaddrinfoResolverNetwork func() string
}

var _ model.UnderlyingNetwork = &UnderlyingNetwork{}

func (un *UnderlyingNetwork) DialContext(ctx context.Context, timeout time.Duration, network, address string) (net.Conn, error) {
	return un.MockDialContext(ctx, timeout, network, address)
}

func (un *UnderlyingNetwork) ListenUDP(network string, addr *net.UDPAddr) (model.UDPLikeConn, error) {
	return un.MockListenUDP(network, addr)
}

func (un *UnderlyingNetwork) GetaddrinfoLookupANY(ctx context.Context, domain string) ([]string, string, error) {
	return un.MockGetaddrinfoLookupANY(ctx, domain)
}

func (un *UnderlyingNetwork) GetaddrinfoResolverNetwork() string {
	return un.MockGetaddrinfoResolverNetwork()
}
