import cron from 'node-cron';
import pool from '../db.js';

/**
 * Initialisiert alle zeitgesteuerten Hintergrund-Aufgaben (Cronjobs) für die Lobby.
 * Wird einmalig beim Serverstart aufgerufen.
 */
export const initLobbyCronJobs = () => {
    console.log('⏰ Initialisiere Lobby Cronjobs...');

    // --------------------------------------------------------------------------
    // CRON: Prüfung geschlossener Sektoren auf freie Kapazitäten
    // Format: 'Minute Stunde Tag Monat Wochentag'
    // '0 4 * * *' bedeutet: Jeden Tag exakt um 04:00 Uhr nachts.
    // --------------------------------------------------------------------------
    cron.schedule('0 4 * * *', async () => {
        console.log('🔍 [CRON] Prüfe geschlossene Sektoren auf freie Startplätze...');
        
        const client = await pool.connect();
        
        try {
            // Alle Sektoren finden, deren Registrierung aktuell geschlossen ist
            const closedSectorsQuery = await client.query(`
                SELECT id, name, api_url
                FROM sectors 
                WHERE is_registration_open = false
            `);

            const closedSectors = closedSectorsQuery.rows;

            if (closedSectors.length === 0) {
                console.log('✅ [CRON] Keine geschlossenen Sektoren gefunden. Nichts zu tun.');
                return;
            }

            // Jeden geschlossenen Sektor einzeln über das Netzwerk abfragen
            for (const sector of closedSectors) {
                try {
                    const response = await fetch(`${sector.api_url}/api/internal/slots`);
                    
                    if (!response.ok) {
                        console.warn(`⚠️ [CRON] Sektor ${sector.name} hat einen Fehler gemeldet (Status: ${response.status}). Überspringe.`);
                        continue;
                    }

                    const data = await response.json();
                    const freeSlots = data.freeSlots;

                    // Auswertung der freien Plätze
                    // Wenn der Sektor wieder mindestens 150 freie Plätze hat, machen wir ihn auf.
                    if (freeSlots >= 150) {
                        console.log(`🔓 [CRON] Sektor ${sector.name} hat ${freeSlots} freie Plätze. Öffne Sektor für Neuregistrierungen!`);
                        
                        await client.query(`
                            UPDATE sectors 
                            SET is_registration_open = true 
                            WHERE id = $1
                        `, [sector.id]);
                    } else {
                        console.log(`🔒 [CRON] Sektor ${sector.name} hat nur ${freeSlots} freie Plätze (unter 150). Bleibt geschlossen.`);
                    }

                } catch (fetchError) {
                    console.warn(`⚠️ [CRON] Netzwerkfehler bei Abfrage von Sektor ${sector.name}:`, fetchError.message);
                }
            }

        } catch (error) {
            console.error('❌ [CRON] Kritischer Datenbank-Fehler beim Prüfen der Sektoren:', error);
        } finally {
            client.release();
        }
    });
};