package testutils

import (
	"fmt"
	"os"
	"testing"

	"veza-backend-api/internal/database"
)

// GetTestDatabaseURL retourne l'URL de la base de données de test (T0041)
func GetTestDatabaseURL() string {
	dbURL := os.Getenv("TEST_DATABASE_URL")
	if dbURL == "" {
		return "postgresql://veza:password@localhost:5432/veza_test_db"
	}
	return dbURL
}

// CleanupDatabase nettoie toutes les tables de la base de données (T0041)
func CleanupDatabase(t *testing.T, db *database.Database) {
	if db == nil || db.GormDB == nil {
		return
	}

	// Désactiver les foreign keys temporairement pour PostgreSQL
	// Note: PostgreSQL utilise session_replication_role pour désactiver les triggers
	db.GormDB.Exec("SET session_replication_role = 'replica'")
	defer db.GormDB.Exec("SET session_replication_role = 'origin'")

	// Supprimer toutes les données dans l'ordre inverse des dépendances
	// Liste basée sur les modèles GORM et les migrations
	tables := []string{
		"messages",
		"playlist_tracks",
		"playlists",
		"tracks",
		"refresh_tokens",
		"room_members",
		"rooms",
		"users",
		// Tables additionnelles qui peuvent exister
		"oauth_accounts",
		"user_profiles",
		"email_verifications",
		"notifications",
		"follows",
		"analytics",
		"admin_logs",
		"audit_logs",
		"totp_configs",
		"recovery_codes",
		"sessions",
		"schema_migrations",
	}

	for _, table := range tables {
		// Utiliser TRUNCATE CASCADE pour supprimer les données et les dépendances
		if err := db.GormDB.Exec(fmt.Sprintf("TRUNCATE TABLE %s CASCADE", table)).Error; err != nil {
			// Ignorer les erreurs si la table n'existe pas (normal pour certains tests)
			t.Logf("Note: Could not truncate table %s (may not exist): %v", table, err)
		}
	}
}
