package database

import (
	"fmt"

	"gorm.io/gorm"
	// models n'est plus importé car AutoMigrate n'est plus utilisé (stratégie 100% SQL)
)

// RunMigrations exécute toutes les migrations GORM automatiques
// et ajoute les indexes personnalisés manquants.
func RunMigrations(db *gorm.DB) error {
	// PostgreSQL active les foreign keys par défaut, pas besoin de PRAGMA

	// Auto-migrate all models
	// STRATÉGIE 100% SQL : Le schéma est géré exclusivement par les migrations SQL.
	// GORM est utilisé uniquement pour mapper les modèles Go sur des tables existantes.
	// Aucun modèle complexe n'est dans AutoMigrate pour éviter les bugs GORM + Postgres + soft delete + indexes.
	modelsToMigrate := []interface{}{
		// Tous les modèles sont gérés par SQL migrations:
		// - users: migrations SQL existantes
		// - tracks: 025_create_tracks.sql + 026_add_track_status.sql
		// - playlists: 030_create_playlists.sql
		// - playlist_tracks: 030_create_playlists.sql
		// - rooms: 041_create_rooms.sql
		// - room_members: 042_create_room_members.sql
		// - messages: 043_create_messages.sql
	}

	for _, model := range modelsToMigrate {
		if err := db.AutoMigrate(model); err != nil {
			return fmt.Errorf("failed to migrate %T: %w", model, err)
		}
	}

	// Add custom indexes
	if err := addIndexes(db); err != nil {
		return fmt.Errorf("failed to add indexes: %w", err)
	}

	return nil
}

// addIndexes ajoute les indexes manquants sur les foreign keys et colonnes fréquemment utilisées
// NOTE: Avec la stratégie 100% SQL, la plupart des indexes sont gérés dans les migrations SQL.
// Cette fonction reste pour compatibilité mais ne fait plus rien.
func addIndexes(db *gorm.DB) error {
	// Tous les indexes sont maintenant gérés par les migrations SQL:
	// - 001_create_users.sql: idx_users_email, idx_users_username, idx_users_slug
	// - 025_create_tracks.sql: idx_tracks_user_id, idx_tracks_is_public, idx_tracks_created_at
	// - 030_create_playlists.sql: idx_playlists_user_id, idx_playlist_tracks_*
	// - 041_create_rooms.sql: idx_rooms_*
	// - 042_create_room_members.sql: idx_room_members_*
	// - 043_create_messages.sql: idx_messages_*

	// Plus rien à faire ici - tous les indexes sont dans les migrations SQL
	return nil
}
