//go:build integration

package collector

import (
	"context"
	"database/sql"
	"os"
	"testing"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

func TestTiDBCollector_SnapshotSeededTable(t *testing.T) {
	dsn := os.Getenv("SENTRY_TEST_DSN")
	if dsn == "" {
		t.Skip("SENTRY_TEST_DSN unset")
	}
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()

	ctx := context.Background()
	_, _ = db.ExecContext(ctx, "DROP TABLE IF EXISTS `sentry_test_collect`")
	_, err = db.ExecContext(ctx, `CREATE TABLE `+"`sentry_test_collect`"+` (
		`+"`Id`"+` VARCHAR(32) PRIMARY KEY,
		`+"`CreatedDate`"+` DATETIME,
		`+"`LastModifiedDate`"+` DATETIME
	)`)
	if err != nil {
		t.Fatal(err)
	}
	defer func() { _, _ = db.ExecContext(ctx, "DROP TABLE `sentry_test_collect`") }()

	_, err = db.ExecContext(ctx, `INSERT INTO `+"`sentry_test_collect`"+` VALUES
		('a', '2026-04-12 09:00:00', '2026-04-12 09:05:00'),
		('b', '2026-04-12 09:01:00', '2026-04-12 09:06:00')`)
	if err != nil {
		t.Fatal(err)
	}

	c := NewTiDBCollector(db, 8, 5*time.Second)
	rows, err := c.Snapshot(ctx, []string{"sentry_test_collect"}, nil)
	if err != nil {
		t.Fatal(err)
	}
	if len(rows) != 1 {
		t.Fatalf("rows=%d", len(rows))
	}
	if rows[0].RowCount != 2 {
		t.Errorf("count=%d want 2", rows[0].RowCount)
	}
	if rows[0].MaxID == nil || *rows[0].MaxID != "b" {
		t.Errorf("max_id=%v want b", rows[0].MaxID)
	}
	if rows[0].Source != "count_star" {
		t.Errorf("source=%s", rows[0].Source)
	}
}

func TestTiDBCollector_DiscoverTables(t *testing.T) {
	dsn := os.Getenv("SENTRY_TEST_DSN")
	if dsn == "" {
		t.Skip("SENTRY_TEST_DSN unset")
	}
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		t.Fatal(err)
	}
	defer db.Close()

	c := NewTiDBCollector(db, 8, 5*time.Second)
	tables, err := c.DiscoverTables(context.Background())
	if err != nil {
		t.Fatal(err)
	}
	if len(tables) == 0 {
		t.Log("no tables found — expected if running against an empty DB")
	}
	// Sanity: no sentry_ tables leaked through
	for _, name := range tables {
		if len(name) >= 7 && name[:7] == "sentry_" {
			t.Errorf("sentry_ table not excluded: %s", name)
		}
	}
}
