package tasktracker

import (
	"path/filepath"
	"testing"
)

func TestTaskManager(t *testing.T) {
	// Create a temporary directory for test storage
	tmpDir := t.TempDir()
	dbPath := filepath.Join(tmpDir, "tasks_test.json")

	tm := NewTaskManager(dbPath)

	// 1. Test LoadTasks on empty/non-existent file
	tasks, err := tm.LoadTasks()
	if err != nil {
		t.Fatalf("LoadTasks failed on non-existent file: %v", err)
	}
	if len(tasks) != 0 {
		t.Errorf("Expected 0 tasks initially, got %d", len(tasks))
	}

	// 2. Test AddTask (First task)
	t1, err := tm.AddTask("Learn Go syntax")
	if err != nil {
		t.Fatalf("AddTask failed: %v", err)
	}
	if t1.ID != 1 {
		t.Errorf("Expected ID 1 for first task, got %d", t1.ID)
	}
	if t1.Description != "Learn Go syntax" {
		t.Errorf("Expected description 'Learn Go syntax', got %q", t1.Description)
	}
	if t1.Done {
		t.Errorf("New task should not be done")
	}

	// 3. Test AddTask (Second task)
	t2, err := tm.AddTask("Build a concurrent app")
	if err != nil {
		t.Fatalf("AddTask failed: %v", err)
	}
	if t2.ID != 2 {
		t.Errorf("Expected ID 2 for second task, got %d", t2.ID)
	}

	// Verify tasks are loaded correctly now
	tasks, err = tm.LoadTasks()
	if err != nil {
		t.Fatalf("LoadTasks failed: %v", err)
	}
	if len(tasks) != 2 {
		t.Errorf("Expected 2 tasks, got %d", len(tasks))
	}

	// 4. Test CompleteTask
	err = tm.CompleteTask(1)
	if err != nil {
		t.Fatalf("CompleteTask failed for ID 1: %v", err)
	}

	// Reload and verify status
	tasks, err = tm.LoadTasks()
	if err != nil {
		t.Fatalf("LoadTasks failed: %v", err)
	}
	if !tasks[0].Done {
		t.Errorf("Expected task 1 to be done")
	}

	// Try completing a non-existent task (should fail)
	err = tm.CompleteTask(999)
	if err == nil {
		t.Error("Expected error when completing non-existent task, got nil")
	}

	// 5. Test DeleteTask
	err = tm.DeleteTask(1)
	if err != nil {
		t.Fatalf("DeleteTask failed for ID 1: %v", err)
	}

	// Reload and verify removal
	tasks, err = tm.LoadTasks()
	if err != nil {
		t.Fatalf("LoadTasks failed: %v", err)
	}
	if len(tasks) != 1 {
		t.Errorf("Expected 1 task after deletion, got %d", len(tasks))
	}
	if tasks[0].ID != 2 {
		t.Errorf("Expected task with ID 2 to remain, got ID %d", tasks[0].ID)
	}

	// Try deleting a non-existent task (should fail)
	err = tm.DeleteTask(999)
	if err == nil {
		t.Error("Expected error when deleting non-existent task, got nil")
	}
}
