package db

import (
	"testing"
	"time"
)

func TestMigrateWorkflowRunSnapshotsMovesLegacyDefinitions(t *testing.T) {
	gdb := openTiDB(t)
	if err := gdb.Exec(`
		CREATE TABLE workflow_runs (
			id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
			workflow_id BIGINT UNSIGNED NOT NULL,
			merge_group_id BIGINT UNSIGNED NULL,
			workflow_path VARCHAR(512) NOT NULL DEFAULT '',
			workflow_definition LONGTEXT,
			created_at DATETIME(3),
			UNIQUE KEY idx_workflow_merge_group (workflow_id, merge_group_id)
		)
	`).Error; err != nil {
		t.Fatalf("create legacy workflow_runs: %v", err)
	}
	createdAt := time.Now().UTC().Truncate(time.Millisecond)
	if err := gdb.Exec(`INSERT INTO workflow_runs (workflow_id, workflow_path, workflow_definition, created_at) VALUES (?, ?, ?, ?)`,
		1, ".github/workflows/ci.yml", "name: CI\n", createdAt).Error; err != nil {
		t.Fatalf("insert legacy workflow run: %v", err)
	}
	if err := gdb.AutoMigrate(&WorkflowRunSnapshot{}); err != nil {
		t.Fatalf("create snapshot table: %v", err)
	}

	if err := MigrateWorkflowRunSnapshots(gdb); err != nil {
		t.Fatalf("MigrateWorkflowRunSnapshots: %v", err)
	}
	var snapshot WorkflowRunSnapshot
	if err := gdb.First(&snapshot, "workflow_run_id = ?", 1).Error; err != nil {
		t.Fatalf("load migrated snapshot: %v", err)
	}
	if snapshot.Definition != LargeText("name: CI\n") {
		t.Fatalf("snapshot definition = %q", snapshot.Definition)
	}
	if gdb.Migrator().HasColumn("workflow_runs", "workflow_definition") {
		t.Fatal("legacy workflow_definition column was not dropped")
	}
	if gdb.Migrator().HasIndex("workflow_runs", "idx_workflow_merge_group") {
		t.Fatal("catalog-ID merge-group index was not dropped")
	}
	if err := MigrateWorkflowRunSnapshots(gdb); err != nil {
		t.Fatalf("idempotent migration: %v", err)
	}
}
