-- ============================================================================
-- Migration 024 - Evidence Automation + Continuous Control Monitoring (P1)
-- ----------------------------------------------------------------------------
-- Colma il gap competitivo vs Vanta/Drata: raccolta automatica evidenze di
-- conformita (NIS2 Art.21) dai connettori esterni e monitoraggio continuo
-- della freschezza/stato dei controlli.
--
--   1) Tabella control_evidence_auto: ogni evidenza raccolta da un collector
--      esterno (M365, AWS, EDR, ...) per uno specifico control_code.
--   2) compliance_controls += monitoring_status, last_checked_at, freshness_days.
--
-- Idempotente via information_schema. Rilanciabile.
--   mysql -h localhost nis2_agile_db -e "source docs/sql/024_evidence_automation.sql"
-- ============================================================================

CREATE TABLE IF NOT EXISTS control_evidence_auto (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    organization_id INT NOT NULL,
    control_code    VARCHAR(50) NOT NULL COMMENT 'Codice controllo (compliance_controls.control_code)',
    source          ENUM('m365','google','aws','azure','idp','edr','siem','api','manual') NOT NULL DEFAULT 'api',
    source_system   VARCHAR(120) NULL COMMENT 'Sistema sorgente (es. Microsoft 365, CrowdStrike)',
    status          ENUM('pass','fail','warning','not_applicable') NOT NULL DEFAULT 'pass' COMMENT 'Esito del check automatico',
    summary         VARCHAR(255) NULL COMMENT 'Sintesi leggibile evidenza',
    payload         JSON NULL COMMENT 'Dettaglio raw evidenza (oggetto del check)',
    external_ref    VARCHAR(190) NULL COMMENT 'ID check esterno (idempotenza per re-collect)',
    collected_at    DATETIME NOT NULL COMMENT 'Quando il collector ha raccolto evidenza',
    valid_until     DATETIME NULL COMMENT 'Scadenza freschezza evidenza (oltre = stale)',
    created_at      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_evi_org_control (organization_id, control_code),
    KEY idx_evi_collected (organization_id, collected_at),
    UNIQUE KEY uq_evi_external (organization_id, control_code, external_ref)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Evidenze raccolte automaticamente dai connettori (Continuous Control Monitoring)';

-- Colonne monitoraggio continuo su compliance_controls
DELIMITER //
DROP PROCEDURE IF EXISTS _mig024_add_col //
CREATE PROCEDURE _mig024_add_col(IN col VARCHAR(64), IN ddl TEXT)
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'compliance_controls' AND COLUMN_NAME = col
    ) THEN
        SET @sql = CONCAT('ALTER TABLE compliance_controls ADD COLUMN ', ddl);
        PREPARE st FROM @sql; EXECUTE st; DEALLOCATE PREPARE st;
    END IF;
END //
DELIMITER ;

CALL _mig024_add_col('monitoring_status', "monitoring_status ENUM('not_monitored','healthy','warning','stale','failing') NOT NULL DEFAULT 'not_monitored' COMMENT 'Stato monitoraggio continuo (calcolato da evidenze automatiche)' AFTER status");
CALL _mig024_add_col('last_checked_at',   "last_checked_at DATETIME NULL COMMENT 'Ultima evidenza automatica ricevuta' AFTER last_verified_at");
CALL _mig024_add_col('freshness_days',    "freshness_days SMALLINT NOT NULL DEFAULT 30 COMMENT 'Giorni entro cui un controllo deve essere ri-verificato da evidenza automatica'");

DROP PROCEDURE IF EXISTS _mig024_add_col;

-- ROLLBACK:
-- DROP TABLE IF EXISTS control_evidence_auto;
-- ALTER TABLE compliance_controls DROP COLUMN monitoring_status, DROP COLUMN last_checked_at, DROP COLUMN freshness_days;
