package utils

import (
	"os"
	"path/filepath"
	"sort"
	"testing"
)

func TestFindDataFiles_Basic(t *testing.T) {
	dir := t.TempDir()
	// Create some .data files
	for _, name := range []string{"a.data", "b.data", "c.data"} {
		if err := os.WriteFile(filepath.Join(dir, name), []byte("[]"), 0644); err != nil {
			t.Fatal(err)
		}
	}
	// Create a non-.data file that should be ignored
	if err := os.WriteFile(filepath.Join(dir, "notes.txt"), []byte("ignore"), 0644); err != nil {
		t.Fatal(err)
	}

	files, err := FindDataFiles(dir)
	if err != nil {
		t.Fatal(err)
	}
	sort.Strings(files)
	if len(files) != 3 {
		t.Fatalf("expected 3 files, got %d: %v", len(files), files)
	}
	for i, base := range []string{"a.data", "b.data", "c.data"} {
		expected := filepath.Join(dir, base)
		if files[i] != expected {
			t.Errorf("file %d: got %q, want %q", i, files[i], expected)
		}
	}
}

func TestFindDataFiles_SkipsHidden(t *testing.T) {
	dir := t.TempDir()
	// Regular .data file
	if err := os.WriteFile(filepath.Join(dir, "visible.data"), []byte("[]"), 0644); err != nil {
		t.Fatal(err)
	}
	// Hidden .data file (should be skipped)
	if err := os.WriteFile(filepath.Join(dir, ".hidden.data"), []byte("[]"), 0644); err != nil {
		t.Fatal(err)
	}

	files, err := FindDataFiles(dir)
	if err != nil {
		t.Fatal(err)
	}
	if len(files) != 1 {
		t.Fatalf("expected 1 file (hidden skipped), got %d: %v", len(files), files)
	}
	if filepath.Base(files[0]) != "visible.data" {
		t.Errorf("got %q, want visible.data", files[0])
	}
}

func TestFindDataFiles_NonRecursive(t *testing.T) {
	dir := t.TempDir()
	// .data file in root
	if err := os.WriteFile(filepath.Join(dir, "root.data"), []byte("[]"), 0644); err != nil {
		t.Fatal(err)
	}
	// .data file in subdirectory (should NOT be found)
	sub := filepath.Join(dir, "subdir")
	if err := os.Mkdir(sub, 0755); err != nil {
		t.Fatal(err)
	}
	if err := os.WriteFile(filepath.Join(sub, "nested.data"), []byte("[]"), 0644); err != nil {
		t.Fatal(err)
	}

	files, err := FindDataFiles(dir)
	if err != nil {
		t.Fatal(err)
	}
	if len(files) != 1 {
		t.Fatalf("expected 1 file (non-recursive), got %d: %v", len(files), files)
	}
	if filepath.Base(files[0]) != "root.data" {
		t.Errorf("got %q, want root.data", files[0])
	}
}

func TestFindDataFiles_EmptyDir(t *testing.T) {
	dir := t.TempDir()
	files, err := FindDataFiles(dir)
	if err != nil {
		t.Fatal(err)
	}
	if len(files) != 0 {
		t.Errorf("expected 0 files, got %d", len(files))
	}
}

func TestFindDataFiles_NonexistentDir(t *testing.T) {
	_, err := FindDataFiles("/nonexistent/path/12345")
	if err == nil {
		t.Error("expected error for nonexistent directory")
	}
}

func TestFindDataFiles_NoDataFiles(t *testing.T) {
	dir := t.TempDir()
	if err := os.WriteFile(filepath.Join(dir, "readme.txt"), []byte("hello"), 0644); err != nil {
		t.Fatal(err)
	}
	files, err := FindDataFiles(dir)
	if err != nil {
		t.Fatal(err)
	}
	if len(files) != 0 {
		t.Errorf("expected 0 files, got %d", len(files))
	}
}