from __future__ import annotations

import json
import re
from pathlib import Path

import pytest

from recoil.pipeline.tools import nightwatch
from recoil.pipeline.tools.autonomy import events


def _read_jsonl(path: Path) -> list[dict]:
    return [
        json.loads(line)
        for line in path.read_text(encoding="utf-8").splitlines()
        if line.strip()
    ]


def test_emit_writes_one_namespaced_json_line(tmp_path):
    ledger = tmp_path / "nightwatch" / "events.jsonl"

    emitted = events.emit(
        "tick_started",
        run_id="run-1",
        issue_id="REC-1",
        night_id="2026-06-06-evening",
        ledger=ledger,
        mode="shadow",
    )

    rows = _read_jsonl(ledger)
    assert len(rows) == 1
    assert rows[0] == emitted
    assert rows[0]["schema"] == "autonomy.v1"
    assert rows[0]["event"] == "autonomy.tick_started"
    assert rows[0]["run_id"] == "run-1"
    assert rows[0]["issue_id"] == "REC-1"
    assert rows[0]["night_id"] == "2026-06-06-evening"
    assert rows[0]["mode"] == "shadow"
    assert rows[0]["host"]
    assert re.fullmatch(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", rows[0]["ts"])


def test_unknown_event_type_raises_without_writing(tmp_path):
    ledger = tmp_path / "events.jsonl"

    with pytest.raises(ValueError):
        events.emit("not_real", ledger=ledger)

    assert not ledger.exists()


def test_ledger_override_writes_tmp_not_default(monkeypatch, tmp_path):
    default_ledger = tmp_path / "default" / "events.jsonl"
    override_ledger = tmp_path / "override" / "events.jsonl"
    monkeypatch.setattr(events.constants, "EVENTS_LEDGER", default_ledger)

    events.emit("no_work", run_id="run-override", ledger=override_ledger)

    assert override_ledger.exists()
    assert not default_ledger.exists()
    assert _read_jsonl(override_ledger)[0]["event"] == "autonomy.no_work"


def test_default_ledger_uses_constants_path(monkeypatch, tmp_path):
    default_ledger = tmp_path / "default" / "events.jsonl"
    monkeypatch.setattr(events.constants, "EVENTS_LEDGER", default_ledger)

    emitted = events.emit(
        "busy_exit",
        run_id="run-default",
        night_id="2026-06-06-evening",
    )

    assert _read_jsonl(default_ledger) == [emitted]


def test_nightwatch_report_ignores_autonomy_events(tmp_path):
    ledger = tmp_path / "events.jsonl"
    event = events.emit("tick_started", run_id="run-report", ledger=ledger)

    report = nightwatch.render_report([event], ledger)

    assert "No confirmed findings." in report
    assert "autonomy.tick_started" not in report
