import { sequelize } from './sequelize.js';
import Match3Level from '../models/match3/level.js';
import Match3TileType from '../models/match3/tileType.js';
import Match3LevelTileType from '../models/match3/levelTileType.js';

/**
 * Aktualisiert bestehende Match3 Level mit den neuen Tile-Typen
 */
async function updateMatch3LevelsWithTileTypes() {
  try {
    console.log('🔄 Aktualisiere Match3 Level mit neuen Tile-Typen...');

    // Synchronisiere die neuen Modelle
    await Match3TileType.sync({ alter: true });
    await Match3LevelTileType.sync({ alter: true });
    console.log('✅ Neue Modelle synchronisiert');

    // Hole alle Level
    const levels = await Match3Level.findAll();
    console.log(`📊 ${levels.length} Level gefunden`);

    // Hole alle verfügbaren Tile-Typen
    const tileTypes = await Match3TileType.findAll();
    console.log(`🎯 ${tileTypes.length} Tile-Typen verfügbar`);

    // Erstelle eine Mapping-Tabelle für die alten tileTypes Arrays
    const tileTypeMapping = {
      'gem': tileTypes.find(t => t.name === 'gem'),
      'star': tileTypes.find(t => t.name === 'star'),
      'heart': tileTypes.find(t => t.name === 'heart'),
      'diamond': tileTypes.find(t => t.name === 'diamond'),
      'circle': tileTypes.find(t => t.name === 'circle'),
      'square': tileTypes.find(t => t.name === 'square'),
      'crown': tileTypes.find(t => t.name === 'crown'),
      'rainbow': tileTypes.find(t => t.name === 'rainbow')
    };

    // Gehe durch alle Level und erstelle Verknüpfungen
    for (const level of levels) {
      console.log(`🔄 Verarbeite Level ${level.order}: ${level.name}`);

      // Lösche bestehende Verknüpfungen für dieses Level
      await Match3LevelTileType.destroy({
        where: { levelId: level.id }
      });

      // Verwende die alten tileTypes Arrays als Fallback
      let levelTileTypes = [];
      if (level.tileTypes && Array.isArray(level.tileTypes)) {
        levelTileTypes = level.tileTypes;
      } else {
        // Fallback: Verwende Standard-Tile-Typen basierend auf der Level-Nummer
        switch (level.order) {
          case 1:
            levelTileTypes = ['gem', 'star', 'heart'];
            break;
          case 2:
            levelTileTypes = ['gem', 'star', 'heart', 'diamond'];
            break;
          case 3:
            levelTileTypes = ['gem', 'star', 'heart', 'diamond', 'circle'];
            break;
          case 4:
            levelTileTypes = ['gem', 'star', 'heart', 'diamond', 'circle', 'square'];
            break;
          case 5:
            levelTileTypes = ['gem', 'star', 'heart', 'diamond', 'circle', 'square', 'crown'];
            break;
          case 6:
            levelTileTypes = ['gem', 'star', 'heart', 'diamond', 'circle', 'square', 'crown', 'rainbow'];
            break;
          default:
            levelTileTypes = ['gem', 'star', 'heart'];
        }
      }

      // Erstelle Verknüpfungen für jeden Tile-Typ
      for (const tileTypeName of levelTileTypes) {
        const tileType = tileTypeMapping[tileTypeName];
        if (tileType) {
          await Match3LevelTileType.create({
            levelId: level.id,
            tileTypeId: tileType.id,
            weight: 1, // Standard-Gewichtung
            isActive: true
          });
          console.log(`  ✅ Verknüpft mit ${tileType.displayName}`);
        } else {
          console.warn(`  ⚠️ Tile-Typ "${tileTypeName}" nicht gefunden`);
        }
      }
    }

    console.log('🎉 Alle Match3 Level erfolgreich mit Tile-Typen verknüpft!');

  } catch (error) {
    console.error('❌ Fehler beim Aktualisieren der Match3 Level:', error);
    throw error;
  }
}

// Führe die Aktualisierung aus, wenn das Skript direkt aufgerufen wird
if (import.meta.url === `file://${process.argv[1]}`) {
  updateMatch3LevelsWithTileTypes()
    .then(() => {
      console.log('✅ Level-Tile-Typ-Aktualisierung abgeschlossen');
      process.exit(0);
    })
    .catch((error) => {
      console.error('❌ Fehler bei der Level-Tile-Typ-Aktualisierung:', error);
      process.exit(1);
    });
}

export default updateMatch3LevelsWithTileTypes;
