#!/usr/bin/env python3
"""Genera documento Word IDS - Conformità ISO 27001"""

from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from datetime import datetime

doc = Document()

style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)

sections = doc.sections
for section in sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

# --- COVER PAGE ---
for _ in range(6):
    doc.add_paragraph("")

title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run("INTRUSION DETECTION SYSTEM (IDS)")
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = RGBColor(0, 51, 102)

subtitle = doc.add_paragraph()
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = subtitle.add_run("Documentazione Funzionale e Conformità ISO/IEC 27001:2022")
run.font.size = Pt(16)
run.font.color.rgb = RGBColor(51, 51, 51)

doc.add_paragraph("")

info = doc.add_paragraph()
info.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = info.add_run("Sistema di Rilevamento Intrusioni per Router MikroTik\ncon Machine Learning e Blocco Automatico")
run.font.size = Pt(12)
run.font.color.rgb = RGBColor(100, 100, 100)

doc.add_paragraph("")
doc.add_paragraph("")

meta = doc.add_paragraph()
meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = meta.add_run(f"Versione: 2.0.0\nData: {datetime.now().strftime('%d/%m/%Y')}\nClassificazione: Riservato")
run.font.size = Pt(11)
run.font.color.rgb = RGBColor(100, 100, 100)

doc.add_page_break()

# --- TABLE OF CONTENTS ---
doc.add_heading('Indice', level=1)
toc_items = [
    "1. Introduzione e Scopo del Documento",
    "2. Panoramica del Sistema IDS",
    "3. Architettura del Sistema",
    "4. Funzionalità del Sistema",
    "   4.1 Raccolta e Analisi Log (Syslog)",
    "   4.2 Rilevamento Anomalie con Machine Learning",
    "   4.3 Blocco Automatico degli IP Malevoli",
    "   4.4 Gestione Whitelist e Blacklist",
    "   4.5 Liste Pubbliche e Threat Intelligence",
    "   4.6 Dashboard e Monitoraggio in Tempo Reale",
    "   4.7 Geolocalizzazione IP",
    "   4.8 Gestione Router MikroTik",
    "   4.9 Pulizia Automatica dei Dati",
    "   4.10 Monitoraggio Servizi",
    "5. Mappatura Controlli ISO/IEC 27001:2022",
    "6. Controlli Annex A Coperti",
    "7. Politiche di Sicurezza Implementate",
    "8. Gestione degli Incidenti",
    "9. Continuità Operativa e Disponibilità",
    "10. Audit e Tracciabilità",
    "11. Conclusioni",
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(2)

doc.add_page_break()

# --- 1. INTRODUZIONE ---
doc.add_heading('1. Introduzione e Scopo del Documento', level=1)
doc.add_paragraph(
    "Il presente documento descrive le funzionalità, l'architettura e le misure di sicurezza "
    "implementate nel Sistema di Rilevamento Intrusioni (IDS) progettato per ambienti di rete "
    "basati su router MikroTik. Lo scopo principale è fornire evidenza documentale della conformità "
    "del sistema ai requisiti dello standard ISO/IEC 27001:2022, con particolare riferimento ai "
    "controlli dell'Annex A relativi alla sicurezza delle reti, al monitoraggio, alla gestione "
    "degli incidenti e alla protezione delle informazioni."
)
doc.add_paragraph(
    "Questo documento è destinato a responsabili della sicurezza informatica, auditor interni "
    "ed esterni, e al management aziendale coinvolto nel Sistema di Gestione della Sicurezza "
    "delle Informazioni (SGSI/ISMS)."
)

# --- 2. PANORAMICA ---
doc.add_heading('2. Panoramica del Sistema IDS', level=1)
doc.add_paragraph(
    "L'IDS è un sistema completo di sicurezza di rete che integra raccolta log in tempo reale, "
    "analisi basata su Machine Learning, blocco automatico degli IP malevoli e monitoraggio "
    "continuo dello stato della rete. Il sistema è progettato per operare in ambienti con "
    "10+ router MikroTik e gestire volumi elevati di traffico (186M+ record di log di rete)."
)

doc.add_heading('Caratteristiche Principali', level=2)
features_main = [
    "Rilevamento anomalie in tempo reale tramite Isolation Forest e classificatore ensemble",
    "Blocco automatico degli IP con risk score >= 80 sui router MikroTik via REST API",
    "Integrazione con feed di threat intelligence pubblici (Spamhaus, Talos, AWS, GCP, Microsoft Azure, Meta/Facebook, Cloudflare)",
    "Dashboard web interattiva con visualizzazioni in tempo reale",
    "Gestione whitelist/blacklist con supporto completo CIDR",
    "Geolocalizzazione automatica degli IP rilevati",
    "Sistema di pulizia automatica dei dati obsoleti",
    "Monitoraggio continuo dei servizi di sistema",
]
for f in features_main:
    doc.add_paragraph(f, style='List Bullet')

# --- 3. ARCHITETTURA ---
doc.add_heading('3. Architettura del Sistema', level=1)
doc.add_paragraph(
    "Il sistema adotta un'architettura a microservizi composta da tre componenti principali:"
)

arch_table = doc.add_table(rows=5, cols=3)
arch_table.style = 'Light Grid Accent 1'
arch_table.alignment = WD_TABLE_ALIGNMENT.CENTER

headers = ['Componente', 'Tecnologia', 'Funzione']
for i, h in enumerate(headers):
    arch_table.rows[0].cells[i].text = h
    for paragraph in arch_table.rows[0].cells[i].paragraphs:
        for run in paragraph.runs:
            run.bold = True

arch_data = [
    ['Frontend Web', 'React, ShadCN UI, TanStack Query', 'Dashboard di monitoraggio, gestione whitelist/blacklist, visualizzazione rilevamenti'],
    ['Backend API', 'Node.js, Express, Drizzle ORM', 'API REST, gestione database PostgreSQL, coordinamento servizi'],
    ['Backend ML', 'Python, FastAPI, scikit-learn, XGBoost', 'Analisi anomalie con Isolation Forest e classificatore ensemble, blocco automatico IP'],
    ['Database', 'PostgreSQL', 'Persistenza dati: log di rete, rilevamenti, whitelist, blacklist, configurazione router'],
]
for i, row_data in enumerate(arch_data):
    for j, cell_text in enumerate(row_data):
        arch_table.rows[i+1].cells[j].text = cell_text

doc.add_paragraph("")
doc.add_paragraph(
    "La comunicazione tra i componenti avviene tramite API REST protette da autenticazione "
    "mediante API Key (header X-API-Key). Il database PostgreSQL è accessibile solo dai "
    "backend tramite connessione autenticata."
)

# --- 4. FUNZIONALITÀ ---
doc.add_heading('4. Funzionalità del Sistema', level=1)

# 4.1
doc.add_heading('4.1 Raccolta e Analisi Log (Syslog)', level=2)
doc.add_paragraph(
    "Il componente syslog_parser.py riceve i log syslog via protocollo UDP sulla porta 514 "
    "da tutti i router MikroTik configurati. I log vengono analizzati, normalizzati e "
    "memorizzati nel database PostgreSQL nella tabella network_logs."
)
doc.add_heading('Caratteristiche:', level=3)
syslog_features = [
    "Ricezione syslog UDP sulla porta 514 (standard RFC 5424)",
    "Parsing automatico dei messaggi syslog con estrazione di IP sorgente, destinazione, porte, protocollo",
    "Auto-reconnect e recovery in caso di errori di connessione al database",
    "Politica di retention dei dati: 3 giorni di conservazione dei log grezzi",
    "Gestione di volumi elevati: oltre 186 milioni di record processati",
]
for f in syslog_features:
    doc.add_paragraph(f, style='List Bullet')

# 4.2
doc.add_heading('4.2 Rilevamento Anomalie con Machine Learning', level=2)
doc.add_paragraph(
    "Il cuore del sistema è il motore di Machine Learning che utilizza un approccio ibrido "
    "per il rilevamento delle anomalie, combinando due algoritmi complementari per ridurre "
    "i falsi positivi e migliorare l'accuratezza del rilevamento."
)
doc.add_heading('Algoritmi Utilizzati:', level=3)
ml_features = [
    "Extended Isolation Forest (EIF): algoritmo non supervisionato per il rilevamento di anomalie basato sull'isolamento dei punti dati anomali. Analizza 25 feature di rete estratte dai log.",
    "Classificatore Ensemble con Voting Pesato: combina XGBoost e altri classificatori per una classificazione più precisa delle anomalie rilevate.",
    "Risk Score (0-100): ogni IP riceve un punteggio di rischio su scala 0-100 distribuito su 5 livelli (Normale <40, Basso 40-59, Medio 60-69, Alto 70-84, Critico >=85).",
    "Retraining automatico settimanale del modello ML per adattarsi ai nuovi pattern di traffico.",
    "Analisi ogni 2 minuti dei log dell'ultima ora per rilevamento near-real-time.",
]
for f in ml_features:
    doc.add_paragraph(f, style='List Bullet')

doc.add_heading('Feature di Rete Analizzate (25 feature):', level=3)
doc.add_paragraph(
    "Il modello analizza feature quali: frequenza delle connessioni per IP, distribuzione delle porte "
    "di destinazione, rapporto pacchetti in/out, diversità dei protocolli, pattern temporali, "
    "entropia delle connessioni, velocità di scansione porte, distribuzione geografica delle "
    "connessioni, e altre metriche statistiche derivate dal traffico di rete."
)

# 4.3
doc.add_heading('4.3 Blocco Automatico degli IP Malevoli', level=2)
doc.add_paragraph(
    "Gli IP identificati come critici (risk score >= 80) vengono automaticamente bloccati "
    "su tutti i router MikroTik configurati tramite la REST API di RouterOS."
)
block_features = [
    "Blocco automatico ogni 2 minuti per IP con risk score >= 80",
    "Comunicazione con router MikroTik tramite REST API (HTTP/HTTPS)",
    "Blocco parallelo su tutti i router abilitati contemporaneamente",
    "Verifica whitelist prima del blocco (gli IP in whitelist non vengono mai bloccati)",
    "Blocco massivo retroattivo: endpoint /block-all-critical per bloccare tutti gli IP critici storici non ancora bloccati",
    "Sblocco manuale disponibile dalla dashboard web (pulsante 'Sblocca Router')",
    "Auto-sblocco quando un IP viene aggiunto alla whitelist",
    "Timeout configurabile per le regole di blocco sul router",
    "Tracciamento dello stato di blocco nel database (campo blocked e blocked_at)",
]
for f in block_features:
    doc.add_paragraph(f, style='List Bullet')

# 4.4
doc.add_heading('4.4 Gestione Whitelist e Blacklist', level=2)
doc.add_paragraph(
    "Il sistema gestisce whitelist e blacklist con supporto completo per singoli IP e "
    "range CIDR, utilizzando i tipi nativi INET/CIDR di PostgreSQL per un matching efficiente."
)
wl_features = [
    "Whitelist manuale: aggiunta/rimozione IP dalla dashboard web con motivo e note",
    "Blacklist automatica: alimentata da feed di threat intelligence pubblici",
    "Supporto completo CIDR: matching di range di rete (es. 192.168.0.0/16) con operatori PostgreSQL <<=",
    "Logica di priorità: Whitelist manuale > Whitelist pubblica > Blacklist",
    "Auto-sblocco dai router quando un IP viene aggiunto alla whitelist",
    "Paginazione server-side (50 record/pagina) e ricerca con debounce per performance",
    "Campo source per tracciare l'origine di ogni entry (manuale, Spamhaus, AWS, ecc.)",
]
for f in wl_features:
    doc.add_paragraph(f, style='List Bullet')

# 4.5
doc.add_heading('4.5 Liste Pubbliche e Threat Intelligence', level=2)
doc.add_paragraph(
    "Il sistema integra automaticamente feed di threat intelligence da fonti pubbliche riconosciute, "
    "sincronizzandoli ogni 10 minuti per mantenere aggiornate le liste di IP noti come malevoli "
    "o appartenenti a provider cloud legittimi."
)

lists_table = doc.add_table(rows=8, cols=3)
lists_table.style = 'Light Grid Accent 1'
lists_table.alignment = WD_TABLE_ALIGNMENT.CENTER

list_headers = ['Feed', 'Tipo', 'Descrizione']
for i, h in enumerate(list_headers):
    lists_table.rows[0].cells[i].text = h
    for paragraph in lists_table.rows[0].cells[i].paragraphs:
        for run in paragraph.runs:
            run.bold = True

list_data = [
    ['Spamhaus DROP', 'Blacklist', "Lista di IP/CIDR noti per attività malevole (spam, botnet, C&C)"],
    ['Talos Intelligence', 'Blacklist', 'Feed di threat intelligence di Cisco Talos'],
    ['Amazon AWS', 'Whitelist', 'Range IP ufficiali dei servizi cloud AWS'],
    ['Google Cloud/GCP', 'Whitelist', 'Range IP ufficiali dei servizi Google Cloud'],
    ['Microsoft Azure', 'Whitelist', 'Range IP ufficiali dei servizi cloud Microsoft Azure'],
    ['Meta (Facebook)', 'Whitelist', 'Range IP di Meta (Facebook, Instagram, WhatsApp)'],
    ['Cloudflare', 'Whitelist', 'Range IP della CDN Cloudflare'],
]
for i, row_data in enumerate(list_data):
    for j, cell_text in enumerate(row_data):
        lists_table.rows[i+1].cells[j].text = cell_text

doc.add_paragraph("")
doc.add_paragraph(
    "La merge logic applica una priorità basata sul tipo: gli IP in whitelist manuale hanno "
    "sempre la precedenza, seguiti dalla whitelist pubblica e infine dalla blacklist. Questo "
    "previene il blocco accidentale di servizi cloud legittimi."
)

# 4.6
doc.add_heading('4.6 Dashboard e Monitoraggio in Tempo Reale', level=2)
doc.add_paragraph(
    "La dashboard web fornisce una visione completa e in tempo reale dello stato della "
    "sicurezza di rete, con aggiornamento automatico ogni 10 secondi."
)
dash_features = [
    "Panoramica generale: contatori di router attivi, rilevamenti totali, IP bloccati, IP critici",
    "Pagina Rilevamenti: elenco paginato (50/pagina) con ricerca server-side su IP, paese, organizzazione",
    "Pagina Whitelist: gestione paginata con ricerca e operazioni CRUD",
    "Pagina Analytics: grafici e visualizzazioni del traffico normale vs attacco",
    "Filtri avanzati: per tipo di anomalia (DDoS, Port Scan, Brute Force, Botnet), range di risk score",
    "Indicatori visivi: badge colorati per livelli di rischio, stato di blocco, flag paese",
    "Monitoraggio servizi: stato in tempo reale di ML Backend, Database, Syslog Parser",
    "Operazioni dirette: pulsanti per aggiungere a whitelist, sbloccare router, avviare training ML",
]
for f in dash_features:
    doc.add_paragraph(f, style='List Bullet')

# 4.7
doc.add_heading('4.7 Geolocalizzazione IP', level=2)
doc.add_paragraph(
    "Integrazione con il servizio ip-api.com per arricchire ogni rilevamento con informazioni "
    "geografiche e di rete, inclusi paese, città, ISP, numero AS e organizzazione. "
    "Il sistema implementa caching intelligente per ridurre le chiamate API e rispettare i "
    "rate limit del servizio."
)

# 4.8
doc.add_heading('4.8 Gestione Router MikroTik', level=2)
doc.add_paragraph(
    "Il sistema comunica con i router MikroTik tramite la REST API di RouterOS, "
    "supportando operazioni parallele su multipli router contemporaneamente."
)
router_features = [
    "Configurazione router: IP, porta API, credenziali, abilitazione/disabilitazione",
    "Test di connettività automatico",
    "Supporto HTTP (porta 80) e HTTPS (porta 443) con gestione certificati SSL/TLS",
    "Operazioni parallele su tutti i router (blocco/sblocco simultaneo)",
    "Gestione address-list di firewall (aggiunta, rimozione, lettura)",
    "Compatibilità con RouterOS 7.x e versioni successive",
]
for f in router_features:
    doc.add_paragraph(f, style='List Bullet')

# 4.9
doc.add_heading('4.9 Pulizia Automatica dei Dati', level=2)
doc.add_paragraph(
    "Un timer systemd orario esegue lo script cleanup_detections.py che:"
)
cleanup_features = [
    "Rimuove rilevamenti più vecchi di 48 ore",
    "Sblocca automaticamente gli IP bloccati da più di 2 ore",
    "Mantiene la retention dei log di rete a 3 giorni",
    "Registra statistiche di pulizia nei log di sistema",
]
for f in cleanup_features:
    doc.add_paragraph(f, style='List Bullet')

# 4.10
doc.add_heading('4.10 Monitoraggio Servizi', level=2)
doc.add_paragraph(
    "La dashboard fornisce monitoraggio in tempo reale dello stato dei servizi critici "
    "con possibilità di riavvio tramite API protette."
)
service_features = [
    "Monitoraggio stato: ML Backend, Database PostgreSQL, Syslog Parser",
    "API per gestione servizi (start/stop/restart) protette da API Key",
    "Integrazione con systemd per il controllo dei servizi Python",
    "Health check endpoint (/health) per verifica rapida dello stato del sistema",
]
for f in service_features:
    doc.add_paragraph(f, style='List Bullet')

# --- 5. MAPPATURA ISO 27001 ---
doc.add_heading('5. Mappatura Controlli ISO/IEC 27001:2022', level=1)
doc.add_paragraph(
    "La seguente tabella mappa le funzionalità dell'IDS ai controlli dell'Annex A dello "
    "standard ISO/IEC 27001:2022, evidenziando come il sistema contribuisce alla conformità."
)

iso_table = doc.add_table(rows=1, cols=4)
iso_table.style = 'Light Grid Accent 1'
iso_table.alignment = WD_TABLE_ALIGNMENT.CENTER

iso_headers = ['Controllo', 'Titolo', 'Funzionalità IDS', 'Copertura']
for i, h in enumerate(iso_headers):
    iso_table.rows[0].cells[i].text = h
    for paragraph in iso_table.rows[0].cells[i].paragraphs:
        for run in paragraph.runs:
            run.bold = True

iso_mappings = [
    ['A.5.1', 'Politiche per la sicurezza delle informazioni',
     'Politiche di blocco automatico, soglie di rischio configurabili, logica di priorità whitelist/blacklist',
     'Parziale'],
    ['A.5.7', 'Threat intelligence',
     'Integrazione automatica con 7+ feed di threat intelligence (Spamhaus, Talos, AWS, GCP, Azure, Meta, Cloudflare)',
     'Completa'],
    ['A.5.24', 'Pianificazione e preparazione della gestione degli incidenti',
     'Rilevamento automatico anomalie, classificazione per livello di rischio, workflow di risposta automatizzato',
     'Completa'],
    ['A.5.25', 'Valutazione e decisione sugli eventi di sicurezza',
     'Risk scoring ML (0-100), classificazione automatica in 5 livelli, soglie configurabili',
     'Completa'],
    ['A.5.26', 'Risposta agli incidenti di sicurezza',
     'Blocco automatico IP critici sui router, sblocco manuale, gestione whitelist',
     'Completa'],
    ['A.5.28', 'Raccolta delle evidenze',
     'Log completi di tutte le operazioni, timestamp di rilevamento e blocco, geolocalizzazione',
     'Completa'],
    ['A.8.1', 'Dispositivi endpoint utente',
     'Protezione della rete tramite blocco IP malevoli a livello router (perimetrale)',
     'Parziale'],
    ['A.8.9', 'Gestione della configurazione',
     'Gestione centralizzata della configurazione dei router, migrazioni database versionante',
     'Parziale'],
    ['A.8.15', 'Logging',
     'Raccolta syslog centralizzata da tutti i router, retention 3 giorni, 186M+ record',
     'Completa'],
    ['A.8.16', 'Attività di monitoraggio',
     'Dashboard real-time, auto-refresh 10s, monitoraggio servizi, alert visivi per livelli di rischio',
     'Completa'],
    ['A.8.20', 'Sicurezza delle reti',
     'Firewall automatico via address-list MikroTik, blocco parallelo su tutti i router',
     'Completa'],
    ['A.8.21', 'Sicurezza dei servizi di rete',
     'Protezione contro DDoS, port scanning, brute force, botnet tramite rilevamento ML',
     'Completa'],
    ['A.8.22', 'Segregazione delle reti',
     'Supporto multi-router con configurazioni indipendenti, blocco selettivo per router',
     'Parziale'],
    ['A.8.23', 'Filtraggio web',
     'Blocco IP malevoli a livello di rete, integrazione blacklist/whitelist',
     'Parziale'],
]

for mapping in iso_mappings:
    row = iso_table.add_row()
    for i, cell_text in enumerate(mapping):
        row.cells[i].text = cell_text

# --- 6. CONTROLLI ANNEX A ---
doc.add_heading('6. Controlli Annex A Coperti - Dettaglio', level=1)

doc.add_heading('A.5.7 - Threat Intelligence', level=2)
doc.add_paragraph(
    "Il sistema implementa un processo automatizzato di raccolta e integrazione di threat intelligence "
    "da fonti pubbliche riconosciute a livello internazionale. La sincronizzazione avviene ogni 10 minuti "
    "tramite il servizio ids-list-fetcher, che scarica, analizza e aggiorna le liste nel database. "
    "La merge logic applica una gerarchia di priorità per evitare conflitti tra liste diverse."
)

doc.add_heading('A.5.24/25/26 - Gestione Incidenti', level=2)
doc.add_paragraph(
    "Il ciclo di vita degli incidenti di sicurezza è gestito automaticamente:\n"
    "1. RILEVAMENTO: Il modello ML analizza i log ogni 2 minuti e identifica anomalie\n"
    "2. CLASSIFICAZIONE: Ogni anomalia riceve un risk score e viene categorizzata (DDoS, Port Scan, Brute Force, Botnet)\n"
    "3. RISPOSTA: Gli IP con score >= 80 vengono bloccati automaticamente sui router\n"
    "4. DOCUMENTAZIONE: Ogni evento viene registrato con timestamp, geolocalizzazione, score e stato di blocco\n"
    "5. RISOLUZIONE: Pulizia automatica dopo 48 ore, sblocco dopo 2 ore, possibilità di whitelist manuale"
)

doc.add_heading('A.8.15/16 - Logging e Monitoraggio', level=2)
doc.add_paragraph(
    "Il sistema fornisce capacità complete di logging e monitoraggio:\n"
    "- Raccolta centralizzata dei log syslog da tutti i router via UDP:514\n"
    "- Conservazione dei log per 3 giorni con retention policy automatica\n"
    "- Dashboard di monitoraggio con aggiornamento ogni 10 secondi\n"
    "- Monitoraggio dello stato dei servizi (ML Backend, Database, Syslog Parser)\n"
    "- Visualizzazioni analitiche del traffico normale vs attacco\n"
    "- Paginazione e ricerca server-side per gestire grandi volumi di dati"
)

# --- 7. POLITICHE DI SICUREZZA ---
doc.add_heading('7. Politiche di Sicurezza Implementate', level=1)

doc.add_heading('7.1 Autenticazione e Controllo Accessi', level=2)
sec_features = [
    "API Key authentication (header X-API-Key) per tutti gli endpoint del backend ML",
    "Credenziali router cifrate nel database",
    "Connessioni database autenticate con credenziali separate",
    "Supporto HTTPS/TLS per la comunicazione con i router MikroTik",
]
for f in sec_features:
    doc.add_paragraph(f, style='List Bullet')

doc.add_heading('7.2 Protezione dei Dati', level=2)
data_features = [
    "Database PostgreSQL con accesso autenticato",
    "Retention policy automatica: 3 giorni per log, 48 ore per rilevamenti",
    "Nessun dato sensibile esposto tramite API pubblica",
    "Validazione input con schema Zod per prevenire injection",
    "Query parametrizzate per prevenire SQL injection",
]
for f in data_features:
    doc.add_paragraph(f, style='List Bullet')

doc.add_heading('7.3 Disponibilità e Resilienza', level=2)
avail_features = [
    "Auto-reconnect del parser syslog in caso di disconnessione dal database",
    "Timer systemd con restart automatico dei servizi in caso di failure",
    "Health check endpoint per monitoraggio esterno",
    "Architettura a microservizi: il failure di un componente non blocca gli altri",
]
for f in avail_features:
    doc.add_paragraph(f, style='List Bullet')

# --- 8. GESTIONE INCIDENTI ---
doc.add_heading('8. Gestione degli Incidenti', level=1)

doc.add_heading('8.1 Workflow di Risposta Automatica', level=2)
doc.add_paragraph(
    "Il sistema implementa un workflow di risposta automatica agli incidenti di sicurezza:"
)

incident_table = doc.add_table(rows=6, cols=3)
incident_table.style = 'Light Grid Accent 1'
incident_table.alignment = WD_TABLE_ALIGNMENT.CENTER

inc_headers = ['Fase', 'Azione', 'Tempistica']
for i, h in enumerate(inc_headers):
    incident_table.rows[0].cells[i].text = h
    for paragraph in incident_table.rows[0].cells[i].paragraphs:
        for run in paragraph.runs:
            run.bold = True

inc_data = [
    ['1. Raccolta', 'Ricezione log syslog da router MikroTik', 'Tempo reale (UDP)'],
    ['2. Analisi', 'Analisi ML con Isolation Forest + Ensemble', 'Ogni 2 minuti'],
    ['3. Classificazione', 'Assegnazione risk score e tipo anomalia', 'Automatica'],
    ['4. Risposta', 'Blocco automatico IP su tutti i router (score >= 80)', 'Immediato dopo analisi'],
    ['5. Documentazione', 'Registrazione con geolocalizzazione e timestamp', 'Automatica'],
]
for i, row_data in enumerate(inc_data):
    for j, cell_text in enumerate(row_data):
        incident_table.rows[i+1].cells[j].text = cell_text

doc.add_paragraph("")

doc.add_heading('8.2 Tipi di Anomalie Rilevate', level=2)
anomaly_table = doc.add_table(rows=6, cols=2)
anomaly_table.style = 'Light Grid Accent 1'
anomaly_table.alignment = WD_TABLE_ALIGNMENT.CENTER

anom_headers = ['Tipo', 'Descrizione']
for i, h in enumerate(anom_headers):
    anomaly_table.rows[0].cells[i].text = h
    for paragraph in anomaly_table.rows[0].cells[i].paragraphs:
        for run in paragraph.runs:
            run.bold = True

anom_data = [
    ['DDoS Attack', 'Attacco Distributed Denial of Service - elevato volume di traffico da singola sorgente'],
    ['Port Scanning', "Scansione sistematica delle porte per identificare servizi vulnerabili"],
    ['Brute Force', 'Tentativi ripetuti di autenticazione con credenziali diverse'],
    ['Botnet Activity', 'Traffico riconducibile a reti di dispositivi compromessi (C&C)'],
    ['Suspicious Activity', 'Comportamento anomalo non classificabile nelle categorie precedenti'],
]
for i, row_data in enumerate(anom_data):
    for j, cell_text in enumerate(row_data):
        anomaly_table.rows[i+1].cells[j].text = cell_text

# --- 9. CONTINUITÀ ---
doc.add_heading('9. Continuità Operativa e Disponibilità', level=1)
doc.add_paragraph(
    "Il sistema è progettato per operare in modo continuo e autonomo, minimizzando "
    "l'intervento manuale e garantendo la disponibilità del servizio di monitoraggio."
)
continuity_features = [
    "Servizi gestiti da systemd con restart automatico in caso di failure (Restart=always)",
    "Timer systemd per operazioni periodiche (analisi ML ogni 2 min, pulizia oraria, sync liste ogni 10 min)",
    "Auto-reconnect del parser syslog in caso di perdita connessione al database",
    "Architettura a microservizi: il failure del backend ML non blocca la raccolta log",
    "Health check endpoint per integrazione con sistemi di monitoraggio esterni (Nagios, Zabbix, ecc.)",
    "Database PostgreSQL con supporto a backup e recovery point-in-time",
    "Migrazioni database versionante per aggiornamenti sicuri dello schema",
]
for f in continuity_features:
    doc.add_paragraph(f, style='List Bullet')

# --- 10. AUDIT ---
doc.add_heading('10. Audit e Tracciabilità', level=1)
doc.add_paragraph(
    "Il sistema mantiene traccia completa di tutte le operazioni per supportare attività "
    "di audit e conformità:"
)
audit_features = [
    "Log di tutti i rilevamenti con timestamp, risk score, tipo anomalia, geolocalizzazione",
    "Registrazione delle operazioni di blocco/sblocco con timestamp (blocked_at)",
    "Storico delle entry di whitelist con data di creazione e motivo",
    "Log delle sincronizzazioni delle liste pubbliche con conteggio IP aggiunti/rimossi",
    "Storico dei training del modello ML con parametri e risultati",
    "Log di sistema via journald per tutti i servizi (accessibili con journalctl)",
    "Database delle migrazioni con versioning per tracciare le modifiche allo schema",
]
for f in audit_features:
    doc.add_paragraph(f, style='List Bullet')

# --- 11. CONCLUSIONI ---
doc.add_heading('11. Conclusioni', level=1)
doc.add_paragraph(
    "Il Sistema di Rilevamento Intrusioni (IDS) implementa un insieme completo di controlli "
    "di sicurezza che contribuiscono significativamente alla conformità con lo standard "
    "ISO/IEC 27001:2022. In particolare, il sistema copre in modo completo i controlli "
    "relativi a:"
)
conclusions = [
    "Threat intelligence (A.5.7): integrazione automatica con 7+ feed pubblici",
    "Gestione degli incidenti (A.5.24-A.5.28): workflow completo dalla rilevazione alla risoluzione",
    "Logging e monitoraggio (A.8.15-A.8.16): raccolta centralizzata e dashboard real-time",
    "Sicurezza delle reti (A.8.20-A.8.21): protezione attiva tramite blocco automatico",
]
for c in conclusions:
    doc.add_paragraph(c, style='List Bullet')

doc.add_paragraph("")
doc.add_paragraph(
    "Il sistema richiede integrazione con ulteriori controlli organizzativi, procedurali e "
    "tecnici per una conformità completa allo standard ISO 27001, tra cui: politiche formali "
    "documentate, formazione del personale, gestione degli asset, controllo degli accessi "
    "fisici e logici, e processi di audit interno periodico."
)

doc.add_paragraph("")
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("--- Fine del Documento ---")
run.font.color.rgb = RGBColor(128, 128, 128)
run.font.size = Pt(10)

# Save
output_path = "IDS_Conformita_ISO27001.docx"
doc.save(output_path)
print(f"Documento generato: {output_path}")
