-- GHard Monitor: схема SQLite.
-- Время — UTC ISO-8601 (строки, лексикографически сортируются корректно).

CREATE TABLE IF NOT EXISTS servers (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    name        TEXT NOT NULL,                   -- отображаемое имя, задаётся в UI
    hostname    TEXT NOT NULL DEFAULT '',        -- как назвался агент
    os          TEXT NOT NULL DEFAULT '',
    kernel      TEXT NOT NULL DEFAULT '',
    ips_json    TEXT NOT NULL DEFAULT '[]',      -- адреса интерфейсов из пакета агента
    source_ip   TEXT NOT NULL DEFAULT '',        -- адрес входящего соединения
    note        TEXT NOT NULL DEFAULT '',        -- заметка: одна на сервер, edit в UI
    key_hash    TEXT NOT NULL UNIQUE,            -- sha256 ключа агента (plaintext нигде не храним)
    interval    INTEGER NOT NULL DEFAULT 30,     -- интервал агента, сек (для детекта offline)
    created_at  TEXT NOT NULL,
    last_seen   TEXT                             -- время последнего ingest (по часам panel)
);

CREATE TABLE IF NOT EXISTS metrics (
    id             INTEGER PRIMARY KEY AUTOINCREMENT,
    server_id      INTEGER NOT NULL REFERENCES servers(id) ON DELETE CASCADE,
    ts             TEXT NOT NULL,                -- timestamp пакета (агент или panel)
    cpu            REAL NOT NULL DEFAULT 0,     -- cpu, %
    load1          REAL NOT NULL DEFAULT 0,
    load5          REAL NOT NULL DEFAULT 0,
    load15         REAL NOT NULL DEFAULT 0,
    ram_used       INTEGER NOT NULL DEFAULT 0,
    ram_total      INTEGER NOT NULL DEFAULT 0,
    swap_used      INTEGER NOT NULL DEFAULT 0,
    swap_total     INTEGER NOT NULL DEFAULT 0,
    uptime         INTEGER NOT NULL DEFAULT 0,   -- сек
    net_in_mbs     REAL NOT NULL DEFAULT 0,      -- суммарный вход, МБ/с (panel считает по дельте)
    net_out_mbs    REAL NOT NULL DEFAULT 0,      -- суммарный выход, МБ/с
    disks_json     TEXT NOT NULL DEFAULT '[]',
    net_json       TEXT NOT NULL DEFAULT '[]',   -- сырые счётчики интерфейсов — для следующей дельты
    processes_json TEXT NOT NULL DEFAULT '[]',
    docker_json    TEXT NOT NULL DEFAULT '[]',
    extra_json     TEXT NOT NULL DEFAULT '{}'    -- temps, smart и прочее, что panel пока не разбирает
);

CREATE INDEX IF NOT EXISTS idx_metrics_server_ts ON metrics(server_id, ts);

CREATE TABLE IF NOT EXISTS events (
    id           INTEGER PRIMARY KEY AUTOINCREMENT,
    server_id    INTEGER REFERENCES servers(id) ON DELETE CASCADE,
    type         TEXT NOT NULL,                  -- cpu_high, server_offline, disk_added, ...
    severity     TEXT NOT NULL DEFAULT 'info',  -- info | warning | critical
    message      TEXT NOT NULL,
    data_json    TEXT NOT NULL DEFAULT '{}',
    ts           TEXT NOT NULL,
    acknowledged INTEGER NOT NULL DEFAULT 0
);

CREATE INDEX IF NOT EXISTS idx_events_server_ts ON events(server_id, ts);