package aghtest

import (
	"context"
	"crypto/sha256"
	"net"
	"sync"
)

// TestResolver is a Resolver for tests.
type TestResolver struct {
	counter     int
	counterLock sync.Mutex
}

// HostToIPs generates IPv4 and IPv6 from host.
func (r *TestResolver) HostToIPs(host string) (ipv4, ipv6 net.IP) {
	hash := sha256.Sum256([]byte(host))

	return net.IP(hash[:4]), net.IP(hash[4:20])
}

// LookupIP implements Resolver interface for *testResolver. It returns the
// slice of net.IP with IPv4 and IPv6 instances.
func (r *TestResolver) LookupIP(_ context.Context, _, host string) (ips []net.IP, err error) {
	ipv4, ipv6 := r.HostToIPs(host)
	addrs := []net.IP{ipv4, ipv6}

	r.counterLock.Lock()
	defer r.counterLock.Unlock()
	r.counter++

	return addrs, nil
}

// LookupHost implements Resolver interface for *testResolver. It returns the
// slice of IPv4 and IPv6 instances converted to strings.
func (r *TestResolver) LookupHost(host string) (addrs []string, err error) {
	ipv4, ipv6 := r.HostToIPs(host)

	r.counterLock.Lock()
	defer r.counterLock.Unlock()
	r.counter++

	return []string{
		ipv4.String(),
		ipv6.String(),
	}, nil
}

// Counter returns the number of requests handled.
func (r *TestResolver) Counter() int {
	r.counterLock.Lock()
	defer r.counterLock.Unlock()

	return r.counter
}