package core

import (
	"slices"
	"testing"
)

func TestEnvs(t *testing.T) {
	db := EphemeralDb(t)
	if err := AddSource(db, "_"); err != nil {
		t.Fatal(err)
	}

	// Insert env
	if err := SetEnvs(db, "_", []string{"ONE=hello"}); err != nil {
		t.Fatal(err)
	}
	envs, err := GetEnvs(db, "_")
	if err != nil {
		t.Fatal(err)
	}
	if len(envs) != 1 {
		t.Fatal("expected 1 env")
	}
	if envs[0] != "ONE=hello" {
		t.Fatalf("Expected ONE=hello, got %s", envs[0])
	}

	// Insert env with = in value
	if err := SetEnvs(db, "_", []string{"TWO=world=true"}); err != nil {
		t.Fatal(err)
	}
	envs, err = GetEnvs(db, "_")
	if err != nil {
		t.Fatal(err)
	}
	if len(envs) != 2 {
		t.Fatal("expected 2 envs")
	}
	slices.Sort(envs) // ONE > TWO
	if envs[1] != "TWO=world=true" {
		t.Fatalf("Expected TWO=world=true, got %s", envs[1])
	}

	// Replace env
	if err := SetEnvs(db, "_", []string{"TWO=goodbye"}); err != nil {
		t.Fatal(err)
	}
	envs, err = GetEnvs(db, "_")
	if err != nil {
		t.Fatal(err)
	}
	if len(envs) != 2 {
		t.Fatal("expected 2 envs")
	}
	slices.Sort(envs) // ONE > TWO
	if envs[1] != "TWO=goodbye" {
		t.Fatalf("Expected TWO=goodbye, got %s", envs[1])
	}

	// Insert is transactional on error
	if err := SetEnvs(db, "_", []string{"THREE=crowd", "FOUR"}); err == nil {
		t.Fatal("expected bad env insert to fail")
	}
	envs, err = GetEnvs(db, "_")
	if err != nil {
		t.Fatal(err)
	}
	if len(envs) != 2 {
		t.Fatal("expected 2 envs after failed insert")
	}
	slices.Sort(envs) // ONE > TWO
	if envs[0] != "ONE=hello" || envs[1] != "TWO=goodbye" {
		t.Fatalf("Expected ONE=hello and TWO=goodbye, got %v", envs)
	}

	// Delete env
	if err := SetEnvs(db, "_", []string{"ONE="}); err != nil {
		t.Fatal(err)
	}
	envs, err = GetEnvs(db, "_")
	if err != nil {
		t.Fatal(err)
	}
	if len(envs) != 1 {
		t.Fatal("expected 1 env after deletion")
	}
	if envs[0] != "TWO=goodbye" {
		t.Fatalf("Expected TWO=goodbye, got %s", envs[0])
	}
}