#!/usr/bin/env node

/**
 * Test-Script für automatisches Löschen
 * 
 * Dieses Script hilft beim Testen des Cleanup-Features:
 * 1. Zeigt alle nicht-freigegebenen Gruppen
 * 2. Erlaubt das Zurückdatieren von Gruppen (für Tests)
 * 3. Zeigt Preview der zu löschenden Gruppen
 * 4. Triggert manuellen Cleanup
 */

const readline = require('readline');
const https = require('http');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const API_BASE = 'http://localhost:5001';

// Helper: HTTP Request
function makeRequest(path, method = 'GET', data = null) {
    return new Promise((resolve, reject) => {
        const url = new URL(path, API_BASE);
        const options = {
            hostname: url.hostname,
            port: url.port,
            path: url.pathname + url.search,
            method: method,
            headers: {
                'Content-Type': 'application/json'
            }
        };

        const req = https.request(options, (res) => {
            let body = '';
            res.on('data', chunk => body += chunk);
            res.on('end', () => {
                try {
                    resolve(JSON.parse(body));
                } catch (e) {
                    resolve(body);
                }
            });
        });

        req.on('error', reject);
        
        if (data) {
            req.write(JSON.stringify(data));
        }
        
        req.end();
    });
}

// Helper: SQL Query über API
async function execSQL(query) {
    // Direkt über docker exec
    const { exec } = require('child_process');
    return new Promise((resolve, reject) => {
        exec(
            `docker compose -f docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db "${query}"`,
            (error, stdout, stderr) => {
                if (error) {
                    reject(error);
                    return;
                }
                resolve(stdout);
            }
        );
    });
}

// Zeige Menü
function showMenu() {
    console.log('\n========================================');
    console.log('   CLEANUP TEST MENÜ');
    console.log('========================================');
    console.log('1. Zeige alle nicht-freigegebenen Gruppen');
    console.log('2. Gruppe um X Tage zurückdatieren (für Tests)');
    console.log('3. Preview: Welche Gruppen würden gelöscht?');
    console.log('4. Cleanup JETZT ausführen');
    console.log('5. Lösch-Historie anzeigen');
    console.log('0. Beenden');
    console.log('========================================\n');
}

// Option 1: Zeige nicht-freigegebene Gruppen
async function showUnapprovedGroups() {
    console.log('\n📋 Lade nicht-freigegebene Gruppen...\n');
    const result = await execSQL(
        'SELECT group_id, year, name, approved, datetime(upload_date) as upload_date, ' +
        'CAST((julianday(\\'now\\') - julianday(upload_date)) AS INTEGER) as days_old ' +
        'FROM groups WHERE approved = 0 ORDER BY upload_date DESC;'
    );
    
    console.log('Gruppe ID     | Jahr | Name      | Freigegeben | Upload-Datum         | Tage alt');
    console.log('------------- | ---- | --------- | ----------- | -------------------- | --------');
    console.log(result || 'Keine nicht-freigegebenen Gruppen gefunden.');
}

// Option 2: Gruppe zurückdatieren
async function backdateGroup() {
    await showUnapprovedGroups();
    
    rl.question('\nGruppe ID zum Zurückdatieren: ', async (groupId) => {
        if (!groupId) {
            console.log('❌ Keine Gruppe ID angegeben');
            return mainMenu();
        }
        
        rl.question('Um wie viele Tage zurückdatieren? (z.B. 8 für 8 Tage alt): ', async (days) => {
            const daysNum = parseInt(days);
            if (isNaN(daysNum) || daysNum < 1) {
                console.log('❌ Ungültige Anzahl Tage');
                return mainMenu();
            }
            
            try {
                await execSQL(
                    `UPDATE groups SET upload_date = datetime('now', '-${daysNum} days') WHERE group_id = '${groupId}';`
                );
                console.log(`✅ Gruppe ${groupId} wurde um ${daysNum} Tage zurückdatiert`);
                
                // Zeige aktualisierte Info
                const result = await execSQL(
                    `SELECT group_id, datetime(upload_date) as upload_date, ` +
                    `CAST((julianday('now') - julianday(upload_date)) AS INTEGER) as days_old ` +
                    `FROM groups WHERE group_id = '${groupId}';`
                );
                console.log('\nAktualisierte Daten:');
                console.log(result);
            } catch (error) {
                console.error('❌ Fehler:', error.message);
            }
            
            mainMenu();
        });
    });
}

// Option 3: Preview Cleanup
async function previewCleanup() {
    console.log('\n🔍 Lade Cleanup Preview...\n');
    try {
        const result = await makeRequest('/api/admin/cleanup/preview');
        
        if (result.groupsToDelete === 0) {
            console.log('✅ Keine Gruppen würden gelöscht (alle sind < 7 Tage alt oder freigegeben)');
        } else {
            console.log(`⚠️  ${result.groupsToDelete} Gruppe(n) würden gelöscht:\n`);
            result.groups.forEach(group => {
                console.log(`  - ${group.group_id} (${group.year}) - ${group.name}`);
                console.log(`    Upload: ${group.uploadDate}`);
                console.log(`    Tage seit Upload: ${Math.abs(group.daysUntilDeletion)}`);
                console.log('');
            });
        }
    } catch (error) {
        console.error('❌ Fehler:', error.message);
    }
    
    mainMenu();
}

// Option 4: Cleanup ausführen
async function executeCleanup() {
    console.log('\n⚠️  ACHTUNG: Dies wird Gruppen permanent löschen!\n');
    
    rl.question('Cleanup wirklich ausführen? (ja/nein): ', async (answer) => {
        if (answer.toLowerCase() !== 'ja') {
            console.log('❌ Abgebrochen');
            return mainMenu();
        }
        
        console.log('\n🔄 Führe Cleanup aus...\n');
        try {
            const result = await makeRequest('/api/admin/cleanup/trigger', 'POST');
            
            console.log('✅ Cleanup abgeschlossen!');
            console.log(`   Gelöschte Gruppen: ${result.result.deletedGroups}`);
            console.log(`   Fehler: ${result.result.failedGroups || 0}`);
        } catch (error) {
            console.error('❌ Fehler:', error.message);
        }
        
        mainMenu();
    });
}

// Option 5: Lösch-Historie
async function showDeletionLog() {
    console.log('\n📜 Lösch-Historie (letzte 10 Einträge)...\n');
    try {
        const result = await makeRequest('/api/admin/deletion-log?limit=10');
        
        if (result.deletions.length === 0) {
            console.log('Keine Einträge im Lösch-Log');
        } else {
            console.log('Gruppe ID     | Jahr | Bilder | Upload-Datum         | Gelöscht am          | Grund');
            console.log('------------- | ---- | ------ | -------------------- | -------------------- | -----');
            result.deletions.forEach(d => {
                console.log(
                    `${d.group_id.padEnd(13)} | ${String(d.year).padEnd(4)} | ${String(d.image_count).padEnd(6)} | ` +
                    `${d.upload_date.substring(0, 19)} | ${d.deleted_at.substring(0, 19)} | ${d.deletion_reason}`
                );
            });
        }
    } catch (error) {
        console.error('❌ Fehler:', error.message);
    }
    
    mainMenu();
}

// Hauptmenü
function mainMenu() {
    showMenu();
    rl.question('Wähle eine Option: ', async (choice) => {
        switch (choice) {
            case '1':
                await showUnapprovedGroups();
                mainMenu();
                break;
            case '2':
                await backdateGroup();
                break;
            case '3':
                await previewCleanup();
                break;
            case '4':
                await executeCleanup();
                break;
            case '5':
                await showDeletionLog();
                break;
            case '0':
                console.log('\n👋 Auf Wiedersehen!\n');
                rl.close();
                process.exit(0);
                break;
            default:
                console.log('❌ Ungültige Option');
                mainMenu();
        }
    });
}

// Start
console.log('\n🚀 Cleanup Test Script gestartet\n');
console.log('Hinweis: Stelle sicher, dass der Dev-Server läuft (./dev.sh)');
mainMenu();
