-- File SQL per la creazione della tabella known_attackers
-- Ottimizzata per gestire traffico di rete di un router con 2000+ utenti e traffico datacenter

-- Eliminazione della tabella se esiste (commenta questa riga per evitare la cancellazione dei dati esistenti)
-- DROP TABLE IF EXISTS known_attackers;

-- Creazione della tabella known_attackers
CREATE TABLE IF NOT EXISTS known_attackers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ip_address VARCHAR(45) NOT NULL COMMENT 'Indirizzo IP del potenziale attaccante (supporta IPv4 e IPv6)',
    first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Prima volta che l\'IP è stato rilevato',
    last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Ultima volta che l\'IP è stato rilevato',
    attack_count INT DEFAULT 1 COMMENT 'Numero di volte che l\'IP è stato rilevato come anomalo',
    risk_level VARCHAR(20) DEFAULT 'MEDIO' COMMENT 'Livello di rischio: BASSO, MEDIO, ALTO, CRITICO',
    ports_used TEXT COMMENT 'Elenco delle porte utilizzate, separate da virgole',
    attack_patterns TEXT COMMENT 'Pattern di attacco rilevati',
    network_segment VARCHAR(50) DEFAULT NULL COMMENT 'Segmento di rete di appartenenza dell\'IP',
    is_blocked TINYINT(1) DEFAULT 0 COMMENT 'Flag che indica se l\'IP è attualmente bloccato',
    notes TEXT DEFAULT NULL COMMENT 'Note e commenti aggiuntivi',
    last_update_user VARCHAR(50) DEFAULT 'sistema' COMMENT 'Utente che ha effettuato l\'ultimo aggiornamento',
    
    -- Indici per migliorare le prestazioni
    UNIQUE KEY unique_ip (ip_address),
    INDEX idx_risk_level (risk_level),
    INDEX idx_last_seen (last_seen),
    INDEX idx_is_blocked (is_blocked)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Tabella che tiene traccia degli IP con comportamenti anomali';

-- Creazione di una vista per gli IP ad alto rischio
CREATE OR REPLACE VIEW high_risk_attackers AS
SELECT * FROM known_attackers 
WHERE risk_level IN ('ALTO', 'CRITICO') 
ORDER BY last_seen DESC;

-- Creazione di una vista per statistiche aggregate
CREATE OR REPLACE VIEW attacker_stats AS
SELECT 
    risk_level,
    COUNT(*) AS num_attackers,
    MIN(first_seen) AS earliest_detection,
    MAX(last_seen) AS latest_detection,
    SUM(attack_count) AS total_attacks,
    AVG(attack_count) AS avg_attacks_per_ip
FROM known_attackers
GROUP BY risk_level
ORDER BY 
    CASE 
        WHEN risk_level = 'CRITICO' THEN 1
        WHEN risk_level = 'ALTO' THEN 2
        WHEN risk_level = 'MEDIO' THEN 3
        WHEN risk_level = 'BASSO' THEN 4
        ELSE 5
    END;

-- Creazione di un trigger per aggiornare automaticamente il campo ports_used
DELIMITER //
CREATE TRIGGER IF NOT EXISTS update_ports_used 
BEFORE UPDATE ON known_attackers
FOR EACH ROW
BEGIN
    IF NEW.ports_used IS NULL AND NEW.ports_used <> OLD.ports_used THEN
        SET NEW.ports_used = OLD.ports_used;
    END IF;
END //
DELIMITER ;

-- Creazione di una procedura per pulizia dati vecchi
DELIMITER //
CREATE PROCEDURE IF NOT EXISTS cleanup_old_attackers(IN days_threshold INT)
BEGIN
    -- Elimina record vecchi con rischio BASSO che non sono stati visti recentemente
    DELETE FROM known_attackers 
    WHERE risk_level = 'BASSO' 
    AND last_seen < DATE_SUB(NOW(), INTERVAL days_threshold DAY);
    
    SELECT CONCAT('Rimossi ', ROW_COUNT(), ' record vecchi.') AS message;
END //
DELIMITER ;

-- Commento finale:
-- Questa tabella è progettata per gestire grandi volumi di traffico di rete.
-- Per mantenere la tabella gestibile nel tempo, eseguire periodicamente:
-- CALL cleanup_old_attackers(30);  -- Rimuove record a basso rischio vecchi di 30+ giorni 