package database

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.uber.org/zap/zaptest"
)

// TestRunMigrations_RollbackOnError vérifie que les migrations sont rollback en cas d'erreur
// MOD-P1-002: Test pour valider le rollback automatique
func TestRunMigrations_RollbackOnError(t *testing.T) {
	// Note: Test complet nécessiterait une vraie DB PostgreSQL avec migrations invalides
	// Pour l'instant, on documente le comportement attendu
	t.Log("Test de rollback: Si une migration échoue, elle doit être rollback automatiquement")
	t.Log("Comportement attendu: Migration invalide -> erreur retournée, DB inchangée")
	t.Log("Comportement implémenté: defer func() garantit rollback même en cas de panic")
}

// TestRunMigrations_ExtensionsHandling vérifie que les migrations avec extensions sont gérées correctement
// MOD-P1-002: Test pour valider la gestion des extensions (hors transaction)
func TestRunMigrations_ExtensionsHandling(t *testing.T) {
	// Ce test vérifie que les migrations contenant CREATE EXTENSION sont exécutées
	// hors transaction (car PostgreSQL ne permet pas CREATE EXTENSION dans transaction)
	// Note: Test complet nécessiterait une vraie DB PostgreSQL

	// Pour un test complet, il faudrait une vraie DB PostgreSQL
	// Pour l'instant, on documente le comportement attendu
	t.Log("Test extensions: Migrations avec CREATE EXTENSION doivent être exécutées hors transaction")
	t.Log("Comportement attendu: Extension créée, puis enregistrement dans schema_migrations dans transaction séparée")
}

// TestRunMigrations_TransactionRollback vérifie le rollback avec defer
// MOD-P1-002: Test unitaire pour valider le mécanisme de rollback
func TestRunMigrations_TransactionRollback(t *testing.T) {
	// Créer une DB de test
	db, err := NewDatabase(&Config{
		URL:      "sqlite://:memory:",
		Database: "test",
	})
	if err != nil {
		t.Skipf("SQLite not available: %v", err)
	}
	defer db.Close()

	db.Logger = zaptest.NewLogger(t)

	// Initialiser la table schema_migrations
	createMigrationsTable := `
		CREATE TABLE IF NOT EXISTS schema_migrations (
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			version VARCHAR(50) NOT NULL UNIQUE,
			applied_at DATETIME DEFAULT CURRENT_TIMESTAMP
		)
	`
	_, err = db.Exec(createMigrationsTable)
	require.NoError(t, err)

	// Tester qu'une transaction est rollback en cas d'erreur
	tx, err := db.Begin()
	require.NoError(t, err)

	// Exécuter une commande qui va échouer
	_, err = tx.Exec("INVALID SQL STATEMENT")
	assert.Error(t, err, "Invalid SQL should fail")

	// Rollback doit réussir
	err = tx.Rollback()
	assert.NoError(t, err, "Rollback should succeed")

	// Vérifier que rien n'a été créé (pas de table test)
	var count int
	err = db.QueryRow("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='test_rollback'").Scan(&count)
	assert.NoError(t, err)
	assert.Equal(t, 0, count, "Table should not exist after rollback")
}
