package dhcpd

import (
	"encoding/json"
	"net"
	"net/netip"
	"os"
	"path/filepath"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

const testData = `[
{"mac":"ESIzRFVm","ip":"AQIDBA==","host":"test1","exp":1},
{"mac":"ZlVEMyIR","ip":"BAMCAQ==","host":"test2","exp":1231231231}
]`

func TestMigrateDB(t *testing.T) {
	dir := t.TempDir()

	oldLeasesPath := filepath.Join(dir, dbFilename)
	dataDirPath := filepath.Join(dir, dataFilename)

	err := os.WriteFile(oldLeasesPath, []byte(testData), 0o644)
	require.NoError(t, err)

	wantLeases := []*Lease{{
		Expiry:   time.Time{},
		Hostname: "test1",
		HWAddr:   net.HardwareAddr{0x11, 0x22, 0x33, 0x44, 0x55, 0x66},
		IP:       netip.MustParseAddr("1.2.3.4"),
		IsStatic: true,
	}, {
		Expiry:   time.Unix(1231231231, 0),
		Hostname: "test2",
		HWAddr:   net.HardwareAddr{0x66, 0x55, 0x44, 0x33, 0x22, 0x11},
		IP:       netip.MustParseAddr("4.3.2.1"),
		IsStatic: false,
	}}

	conf := &ServerConfig{
		WorkDir: dir,
		DataDir: dir,
	}

	err = migrateDB(conf)
	require.NoError(t, err)

	_, err = os.Stat(oldLeasesPath)
	require.ErrorIs(t, err, os.ErrNotExist)

	var data []byte
	data, err = os.ReadFile(dataDirPath)
	require.NoError(t, err)

	dl := &dataLeases{}
	err = json.Unmarshal(data, dl)
	require.NoError(t, err)

	leases := dl.Leases

	for i, wl := range wantLeases {
		assert.Equal(t, wl.Hostname, leases[i].Hostname)
		assert.Equal(t, wl.HWAddr, leases[i].HWAddr)
		assert.Equal(t, wl.IP, leases[i].IP)
		assert.Equal(t, wl.IsStatic, leases[i].IsStatic)

		require.True(t, wl.Expiry.Equal(leases[i].Expiry))
	}
}