package database

import (
	"testing"
)

// Tests are not guaranteed to be sequential

func setupState() (Database, error) {
	db := DbConnect(":memory:")
	err := db.Migrate("../../migrations")
	if err != nil {
		return nil, err
	}
	return db, nil
}

func TestDbConnect(t *testing.T) {
	db := DbConnect(":memory:")
	_ = db
}

func TestDbAddUser(t *testing.T) {
	db, err := setupState()
	if err != nil {
		t.Error("setupState failed:", err)
	}
	err = db.AddUser("test", "password")
	if err != nil {
		t.Error("AddUser failed:", err)
	}
}

func TestDbGetUserId(t *testing.T) {
	db, err := setupState()
	if err != nil {
		t.Error("setupState failed:", err)
	}
	if db.AddUser("test", "password") != nil {
		t.Error("AddUser failed")
	}

	var id int

	id, err = db.GetUserId("test")
	if err != nil {
		t.Error("GetUserId failed:", err)
	}
	if id != 1 {
		t.Error("GetUserId failed: expected 1, got", id)
	}
}

func TestDbAddProject(t *testing.T) {
	db, err := setupState()
	if err != nil {
		t.Error("setupState failed:", err)
	}

	err = db.AddProject("test", "description", "test")
	if err != nil {
		t.Error("AddProject failed:", err)
	}
}

func TestDbRemoveUser(t *testing.T) {
	db, err := setupState()
	if err != nil {
		t.Error("setupState failed:", err)
	}

	err = db.RemoveUser("test")
	if err != nil {
		t.Error("RemoveUser failed:", err)
	}
}

func TestPromoteToAdmin(t *testing.T) {
	db, err := setupState()
	if err != nil {
		t.Error("setupState failed:", err)
	}

	err = db.AddUser("test", "password")
	if err != nil {
		t.Error("AddUser failed:", err)
	}

	err = db.PromoteToAdmin("test")
	if err != nil {
		t.Error("PromoteToAdmin failed:", err)
	}
}

// func TestAddTimeReport(t *testing.T) {

// }

// func TestAddUserToProject(t *testing.T) {

// }

// func TestChangeUserRole(t *testing.T) {

// }