package csvgen

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

	"pinscrape-allgo/internal/config"
	"pinscrape-allgo/internal/db"
)

func makeDB(t *testing.T, root, name string, exportable int) {
	t.Helper()
	path := filepath.Join(root, "database", name+".sqlite")
	conn, err := db.Open(path)
	if err != nil {
		t.Fatal(err)
	}
	if err := db.EnsureSchema(conn); err != nil {
		t.Fatal(err)
	}
	for i := 0; i < exportable; i++ {
		_, err := conn.Exec(`INSERT INTO posts (keyword, slug, images, snippet) VALUES (?,?,?,?)`,
			name+string(rune('a'+i%26)), name, `[{"title":"t","image_url":"u"}]`,
			`{"related_kw":["k"],"description":["d"]}`)
		if err != nil {
			t.Fatal(err)
		}
	}
	db.Close(conn)
}

func TestGenerateSplitSizePrecision(t *testing.T) {
	root := t.TempDir()
	if err := os.MkdirAll(filepath.Join(root, "database"), 0755); err != nil {
		t.Fatal(err)
	}
	// 25 exportable rows, split size 10 -> folders 1,2 with 10 and folder 3 with 5.
	makeDB(t, root, "alpha", 25)

	cfg := &config.Config{Root: root, DataFolder: "database", SplitSize: 10}
	mappings, err := Generate(cfg, 10)
	if err != nil {
		t.Fatal(err)
	}
	if len(mappings) != 3 {
		t.Fatalf("want 3 folders (ceil(25/10)), got %d", len(mappings))
	}
	for i, m := range mappings {
		want := "folder_" + itoa(i+1)
		if m.Foldering != want {
			t.Errorf("foldering[%d] = %s, want %s", i, m.Foldering, want)
		}
	}
}

func TestGenerateExactMultiple(t *testing.T) {
	root := t.TempDir()
	if err := os.MkdirAll(filepath.Join(root, "database"), 0755); err != nil {
		t.Fatal(err)
	}
	makeDB(t, root, "beta", 20)

	cfg := &config.Config{Root: root, DataFolder: "database", SplitSize: 10}
	mappings, err := Generate(cfg, 10)
	if err != nil {
		t.Fatal(err)
	}
	if len(mappings) != 2 {
		t.Fatalf("want exactly 2 folders (20/10), got %d", len(mappings))
	}
}

func itoa(n int) string {
	if n == 0 {
		return "0"
	}
	var b []byte
	for n > 0 {
		b = append([]byte{byte('0' + n%10)}, b...)
		n /= 10
	}
	return string(b)
}
