package websvc_test

import (
	"crypto/tls"
	"encoding/json"
	"net/http"
	"net/netip"
	"net/url"
	"testing"
	"time"

	"github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
	"github.com/AdguardTeam/AdGuardHome/internal/next/agh"
	"github.com/AdguardTeam/AdGuardHome/internal/next/dnssvc"
	"github.com/AdguardTeam/AdGuardHome/internal/next/websvc"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestService_HandleGetSettingsAll(t *testing.T) {
	// TODO(a.garipov): Add all currently supported parameters.

	wantDNS := &websvc.HTTPAPIDNSSettings{
		Addresses:           []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:53")},
		BootstrapServers:    []string{"94.140.14.140", "94.140.14.141"},
		UpstreamServers:     []string{"94.140.14.14", "1.1.1.1"},
		UpstreamTimeout:     aghhttp.JSONDuration(1 * time.Second),
		BootstrapPreferIPv6: true,
	}

	wantWeb := &websvc.HTTPAPIHTTPSettings{
		Addresses:       []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:80")},
		SecureAddresses: []netip.AddrPort{netip.MustParseAddrPort("127.0.0.1:443")},
		Timeout:         aghhttp.JSONDuration(5 * time.Second),
		ForceHTTPS:      true,
	}

	confMgr := newConfigManager()
	confMgr.onDNS = func() (s agh.ServiceWithConfig[*dnssvc.Config]) {
		c, err := dnssvc.New(&dnssvc.Config{
			Addresses:           wantDNS.Addresses,
			UpstreamServers:     wantDNS.UpstreamServers,
			BootstrapServers:    wantDNS.BootstrapServers,
			UpstreamTimeout:     time.Duration(wantDNS.UpstreamTimeout),
			BootstrapPreferIPv6: true,
		})
		require.NoError(t, err)

		return c
	}

	svc, err := websvc.New(&websvc.Config{
		Pprof: &websvc.PprofConfig{
			Enabled: false,
		},
		TLS: &tls.Config{
			Certificates: []tls.Certificate{{}},
		},
		Addresses:       wantWeb.Addresses,
		SecureAddresses: wantWeb.SecureAddresses,
		Timeout:         time.Duration(wantWeb.Timeout),
		ForceHTTPS:      true,
	})
	require.NoError(t, err)

	confMgr.onWeb = func() (s agh.ServiceWithConfig[*websvc.Config]) {
		return svc
	}

	_, addr := newTestServer(t, confMgr)
	u := &url.URL{
		Scheme: "http",
		Host:   addr.String(),
		Path:   websvc.PathV1SettingsAll,
	}

	body := httpGet(t, u, http.StatusOK)
	resp := &websvc.RespGetV1SettingsAll{}
	err = json.Unmarshal(body, resp)
	require.NoError(t, err)

	assert.Equal(t, wantDNS, resp.DNS)
	assert.Equal(t, wantWeb, resp.HTTP)
}
