-- Migration 015 : surveillance d'accessibilité des sites
--
-- Tables :
--   site_uptime_checks  : historique des pings (90 jours, purgés ensuite)
--   site_incidents      : incidents agrégés (groupements de checks en échec)
--
-- Comportement :
--   - Un check est effectué toutes les heures sur chaque site monitoré
--   - Après 3 checks consécutifs en erreur → ouverture d'un incident + email
--   - Après 3 checks consécutifs OK → fermeture de l'incident + email
--   - Si incident reste ouvert : email de rappel toutes les 4h

-- 1. Historique brut des checks
CREATE TABLE IF NOT EXISTS site_uptime_checks (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    site_id INT UNSIGNED NOT NULL,
    checked_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    http_code SMALLINT UNSIGNED NULL COMMENT 'Code HTTP renvoyé, NULL si pas de réponse',
    response_time_ms INT UNSIGNED NULL COMMENT 'Temps de réponse en ms',
    is_up TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 si check OK, 0 sinon',
    error_type VARCHAR(50) NULL COMMENT 'connection_timeout, dns_failure, ssl_failure, http_5xx, http_4xx, keyword_missing, content_error',
    error_message VARCHAR(500) NULL COMMENT 'Message détaillé pour diagnostic',
    KEY idx_site_checked (site_id, checked_at),
    KEY idx_checked_at (checked_at),
    CONSTRAINT fk_uptime_site FOREIGN KEY (site_id) REFERENCES sites(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 2. Incidents (groupements logiques de checks en erreur)
CREATE TABLE IF NOT EXISTS site_incidents (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    site_id INT UNSIGNED NOT NULL,
    started_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Heure du 1er check en erreur',
    ended_at TIMESTAMP NULL COMMENT 'Heure du 1er check OK après résolution',
    error_type VARCHAR(50) NOT NULL COMMENT 'Type principal d''erreur (le plus fréquent)',
    error_summary VARCHAR(500) NULL COMMENT 'Résumé du problème (code HTTP, message)',
    fail_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Nombre de checks en erreur',
    last_email_sent_at TIMESTAMP NULL COMMENT 'Heure du dernier email envoyé (anti-spam)',
    resolved_email_sent TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 si email de résolution envoyé',
    KEY idx_site_status (site_id, ended_at),
    KEY idx_open (ended_at, started_at),
    CONSTRAINT fk_incident_site FOREIGN KEY (site_id) REFERENCES sites(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 3. Colonne sur sites : activer/désactiver le monitoring par site (défaut activé)
ALTER TABLE sites
    ADD COLUMN uptime_monitoring_enabled TINYINT(1) NOT NULL DEFAULT 1
    COMMENT 'Si 0, ce site est exclu de la surveillance uptime';

-- 4. Réglages plateforme : seuils configurables
INSERT INTO platform_settings (setting_key, setting_value, description)
VALUES
    ('uptime_check_timeout_sec', '15', 'Timeout des checks uptime (secondes)'),
    ('uptime_failures_before_alert', '3', 'Nombre de checks consécutifs en erreur avant ouverture d''un incident'),
    ('uptime_successes_before_resolve', '3', 'Nombre de checks consécutifs OK avant fermeture d''un incident'),
    ('uptime_reminder_interval_hours', '4', 'Intervalle en heures entre 2 emails pour un incident ouvert'),
    ('uptime_alert_email', 'stefanos@limbus.fr', 'Adresse email recevant les alertes uptime'),
    ('uptime_retention_days', '90', 'Nombre de jours d''historique détaillé conservé')
ON DUPLICATE KEY UPDATE setting_key = setting_key;
