package records

import (
	"bytes"
	"slices"
	"testing"
	"time"
)

func TestLoop(t *testing.T) {
	r := New()
	r.AddCNameRecord("1", "2", 60)
	r.AddCNameRecord("2", "1", 60)
	if r.GetARecords("1") != nil {
		t.Fatal("loop detected")
	}
	if r.GetARecords("2") != nil {
		t.Fatal("loop detected")
	}
}

func TestCName(t *testing.T) {
	r := New()
	r.AddARecord("example.com", []byte{1, 2, 3, 4}, 60)
	r.AddCNameRecord("gateway.example.com", "example.com", 60)
	records := r.GetARecords("gateway.example.com")
	if records == nil {
		t.Fatal("no records")
	}
	if bytes.Compare(records[0].Address, []byte{1, 2, 3, 4}) != 0 {
		t.Fatal("cname mismatch")
	}
}

func TestA(t *testing.T) {
	r := New()
	r.AddARecord("example.com", []byte{1, 2, 3, 4}, 60)
	records := r.GetARecords("example.com")
	if records == nil {
		t.Fatal("no records")
	}
	if bytes.Compare(records[0].Address, []byte{1, 2, 3, 4}) != 0 {
		t.Fatal("cname mismatch")
	}
}

func TestDeprecated(t *testing.T) {
	r := New()
	r.AddARecord("example.com", []byte{1, 2, 3, 4}, 0)
	time.Sleep(time.Second)
	records := r.GetARecords("example.com")
	if records != nil {
		t.Fatal("deprecated records")
	}
}

func TestNotExistedA(t *testing.T) {
	r := New()
	records := r.GetARecords("example.com")
	if records != nil {
		t.Fatal("not existed records")
	}
}

func TestNotExistedCNameAlias(t *testing.T) {
	r := New()
	r.AddCNameRecord("gateway.example.com", "example.com", 60)
	records := r.GetARecords("gateway.example.com")
	if records != nil {
		t.Fatal("not existed records")
	}
}

func TestReplacing(t *testing.T) {
	r := New()
	r.AddCNameRecord("gateway.example.com", "example.com", 60)
	r.AddARecord("gateway.example.com", []byte{1, 2, 3, 4}, 60)
	records := r.GetARecords("gateway.example.com")
	if bytes.Compare(records[0].Address, []byte{1, 2, 3, 4}) != 0 {
		t.Fatal("mismatch")
	}
}

func TestAliases(t *testing.T) {
	r := New()
	r.AddARecord("1", []byte{1, 2, 3, 4}, 60)
	r.AddCNameRecord("2", "1", 60)
	r.AddCNameRecord("3", "2", 60)
	r.AddCNameRecord("4", "2", 60)
	r.AddCNameRecord("5", "1", 60)
	aliases := r.GetAliases("1")
	if aliases == nil {
		t.Fatal("no aliases")
	}
	if !slices.Contains(aliases, "1") {
		t.Fatal("no 1")
	}
	if !slices.Contains(aliases, "2") {
		t.Fatal("no 2")
	}
	if !slices.Contains(aliases, "3") {
		t.Fatal("no 3")
	}
	if !slices.Contains(aliases, "4") {
		t.Fatal("no 4")
	}
	if !slices.Contains(aliases, "5") {
		t.Fatal("no 5")
	}
}