from __future__ import annotations

import re
import subprocess
from queue import Queue

from agent_guard.events import Event


PATTERNS = [
    re.compile(r"out of memory|oom-kill|killed process", re.I),
    re.compile(r"EXT4-fs error|I/O error|MCE|hung_task|oops|BUG|remount .* read-only", re.I),
]


def match_line(line: str) -> Event | None:
    text = " ".join(line.strip().split())
    for pattern in PATTERNS:
        if pattern.search(text):
            return Event("critical", "kernel", text[:500], actions=["dismiss"])
    return None


def follow(queue: Queue, stop) -> None:
    cmd = ["journalctl", "-f", "-o", "short-iso", "-k"]
    with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True) as proc:
        while not stop.is_set():
            line = proc.stdout.readline() if proc.stdout else ""
            if not line:
                if proc.poll() is not None:
                    break
                continue
            event = match_line(line)
            if event:
                queue.put(event)
