package dhcpsvc_test

import (
	"path/filepath"
	"testing"

	"github.com/AdguardTeam/AdGuardHome/internal/dhcpsvc"
	"github.com/AdguardTeam/golibs/testutil"
)

func TestConfig_Validate(t *testing.T) {
	leasesPath := filepath.Join(t.TempDir(), "leases.json")

	testCases := []struct {
		name       string
		conf       *dhcpsvc.Config
		wantErrMsg string
	}{{
		name:       "nil_config",
		conf:       nil,
		wantErrMsg: "config is nil",
	}, {
		name:       "disabled",
		conf:       &dhcpsvc.Config{},
		wantErrMsg: "",
	}, {
		name: "empty",
		conf: &dhcpsvc.Config{
			Enabled:    true,
			Interfaces: testInterfaceConf,
			DBFilePath: leasesPath,
		},
		wantErrMsg: `bad domain name "": domain name is empty`,
	}, {
		conf: &dhcpsvc.Config{
			Enabled:         true,
			LocalDomainName: testLocalTLD,
			Interfaces:      nil,
			DBFilePath:      leasesPath,
		},
		name:       "no_interfaces",
		wantErrMsg: "no interfaces specified",
	}, {
		conf: &dhcpsvc.Config{
			Enabled:         true,
			LocalDomainName: testLocalTLD,
			Interfaces:      nil,
			DBFilePath:      leasesPath,
		},
		name:       "no_interfaces",
		wantErrMsg: "no interfaces specified",
	}, {
		conf: &dhcpsvc.Config{
			Enabled:         true,
			LocalDomainName: testLocalTLD,
			Interfaces: map[string]*dhcpsvc.InterfaceConfig{
				"eth0": nil,
			},
			DBFilePath: leasesPath,
		},
		name:       "nil_interface",
		wantErrMsg: `interface "eth0": config is nil`,
	}, {
		conf: &dhcpsvc.Config{
			Enabled:         true,
			LocalDomainName: testLocalTLD,
			Interfaces: map[string]*dhcpsvc.InterfaceConfig{
				"eth0": {
					IPv4: nil,
					IPv6: &dhcpsvc.IPv6Config{Enabled: false},
				},
			},
			DBFilePath: leasesPath,
		},
		name:       "nil_ipv4",
		wantErrMsg: `interface "eth0": ipv4: config is nil`,
	}, {
		conf: &dhcpsvc.Config{
			Enabled:         true,
			LocalDomainName: testLocalTLD,
			Interfaces: map[string]*dhcpsvc.InterfaceConfig{
				"eth0": {
					IPv4: &dhcpsvc.IPv4Config{Enabled: false},
					IPv6: nil,
				},
			},
			DBFilePath: leasesPath,
		},
		name:       "nil_ipv6",
		wantErrMsg: `interface "eth0": ipv6: config is nil`,
	}}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			testutil.AssertErrorMsg(t, tc.wantErrMsg, tc.conf.Validate())
		})
	}
}