const { getDatabase } = require('../config/database');

const CATEGORIES = [
    'Risikomanagement',
    'TOM',
    'Incident Management',
    'Business Continuity',
    'Dokumentation',
    'Awareness & Schulung',
];

const DEFAULT_TASKS = [
    { category: 'Risikomanagement', title: 'IT-Assets erfassen', description: 'Alle relevanten Systeme, Server, Cloud-Dienste, Schnittstellen und kritischen Prozesse inventarisieren.' },
    { category: 'Risikomanagement', title: 'Risikoanalyse durchführen', description: 'Bedrohungen und Schwachstellen identifizieren und nach Eintrittswahrscheinlichkeit/Schaden bewerten.' },
    { category: 'Risikomanagement', title: 'Maßnahmenplan ableiten', description: 'Für priorisierte Risiken konkrete technische oder organisatorische Maßnahmen definieren und terminieren.' },
    { category: 'TOM', title: 'Zugriffskonzept erstellen', description: 'Regeln, wer auf welche Systeme zugreifen darf (Least Privilege Prinzip) und regelmäßige Rechteprüfung einführen.' },
    { category: 'TOM', title: 'Patchmanagement regeln', description: 'Prozess definieren, wie Sicherheitsupdates erkannt, bewertet und zeitnah eingespielt werden.' },
    { category: 'TOM', title: 'Backup-Konzept implementieren', description: 'Regelmäßige Datensicherung durchführen und mindestens jährlich Wiederherstellung testen.' },
    { category: 'TOM', title: 'Monitoring einführen', description: 'Sicherheitsrelevante Ereignisse protokollieren und automatisiert überwachen (z. B. SOC/SIEM).' },
    { category: 'Incident Management', title: 'Incident-Response-Plan erstellen', description: 'Definieren, wie Sicherheitsvorfälle erkannt, bewertet, eskaliert und dokumentiert werden.' },
    { category: 'Incident Management', title: 'Meldeprozess definieren (24h/72h)', description: 'Interne Abläufe festlegen, um Fristen für Erstmeldung und Detailmeldung einhalten zu können.' },
    { category: 'Incident Management', title: 'Test durchführen', description: 'Einmal jährlich eine simulierte Cyberattacke als Übung durchführen.' },
    { category: 'Business Continuity', title: 'Kritische Prozesse identifizieren', description: 'Festlegen, welche Geschäftsprozesse bei IT-Ausfall zuerst wiederhergestellt werden müssen.' },
    { category: 'Business Continuity', title: 'Wiederanlaufplan definieren', description: 'Schriftlich festhalten, wie Systeme und Betrieb im Notfall wieder hochgefahren werden.' },
    { category: 'Dokumentation', title: 'Sicherheitsrichtlinie erstellen', description: 'Grundlegende IT-Sicherheitsleitlinie verabschieden und veröffentlichen.' },
    { category: 'Dokumentation', title: 'Nachweisführung etablieren', description: 'Alle Maßnahmen, Schulungen, Prüfungen dokumentieren und versionieren.' },
    { category: 'Awareness & Schulung', title: 'Mitarbeiterschulung durchführen', description: 'Regelmäßige Schulungen zu Phishing, Passwortsicherheit und Umgang mit IT-Vorfällen durchführen.' },
    { category: 'Awareness & Schulung', title: 'Onboarding-Prozess erweitern', description: 'Informationssicherheitsregeln verpflichtend ins Onboarding aufnehmen.' },
];

class IsoTask {
    static migrate() {
        const db = getDatabase();
        db.exec(`
            CREATE TABLE IF NOT EXISTS iso_tasks (
                id           INTEGER PRIMARY KEY AUTOINCREMENT,
                category     TEXT NOT NULL,
                title        TEXT NOT NULL,
                description  TEXT,
                status       TEXT NOT NULL DEFAULT 'Offen'
                             CHECK(status IN ('Offen','In Bearbeitung','Abgeschlossen')),
                responsible  TEXT,
                notes        TEXT,
                sort_order   INTEGER NOT NULL DEFAULT 0,
                created_at   TEXT NOT NULL DEFAULT (datetime('now')),
                updated_at   TEXT NOT NULL DEFAULT (datetime('now'))
            );
        `);
        // Seed if empty
        const count = db.prepare('SELECT COUNT(*) as c FROM iso_tasks').get().c;
        if (count === 0) {
            const stmt = db.prepare(
                'INSERT INTO iso_tasks (category, title, description, sort_order) VALUES (?, ?, ?, ?)'
            );
            DEFAULT_TASKS.forEach((t, i) => stmt.run(t.category, t.title, t.description, i));
        }
    }

    static getAll({ category, status } = {}) {
        const db = getDatabase();
        const where = [];
        const vals = [];
        if (category) { where.push('category = ?'); vals.push(category); }
        if (status)   { where.push('status = ?');   vals.push(status); }
        return db.prepare(
            `SELECT * FROM iso_tasks ${where.length ? 'WHERE ' + where.join(' AND ') : ''} ORDER BY sort_order, id`
        ).all(...vals);
    }

    static getById(id) {
        return getDatabase().prepare('SELECT * FROM iso_tasks WHERE id = ?').get(id);
    }

    static create({ category, title, description, status = 'Offen', responsible, notes, sort_order = 0 }) {
        const db = getDatabase();
        const r = db.prepare(
            'INSERT INTO iso_tasks (category, title, description, status, responsible, notes, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)'
        ).run(category, title, description ?? null, status, responsible ?? null, notes ?? null, sort_order);
        return this.getById(r.lastInsertRowid);
    }

    static update(id, fields) {
        const db = getDatabase();
        const allowed = ['category', 'title', 'description', 'status', 'responsible', 'notes', 'sort_order'];
        const setClauses = [];
        const vals = [];
        for (const key of allowed) {
            if (fields[key] !== undefined) {
                setClauses.push(`${key} = ?`);
                vals.push(fields[key]);
            }
        }
        if (!setClauses.length) return this.getById(id);
        setClauses.push("updated_at = datetime('now')");
        vals.push(id);
        db.prepare(`UPDATE iso_tasks SET ${setClauses.join(', ')} WHERE id = ?`).run(...vals);
        return this.getById(id);
    }

    static delete(id) {
        return getDatabase().prepare('DELETE FROM iso_tasks WHERE id = ?').run(id).changes > 0;
    }
}

module.exports = IsoTask;
