"""Post-update reporting for unresolved SQLite WAL-reset risk."""

from pathlib import Path
from types import SimpleNamespace

from hermes_cli import update_cmd
import hermes_cli.update_cmd_maint as update_cmd_maint
import hermes_cli.update_cmd_deps as update_cmd_deps


def test_runtime_status_probes_running_venv_outside_checkout(tmp_path, monkeypatch):
    running_python = tmp_path / "venv312" / "bin" / "python"
    observed = []
    vulnerable = SimpleNamespace(wal_reset_vulnerable=True)
    monkeypatch.setattr("hermes_constants.project_venv_dir", lambda _root: None)
    monkeypatch.setattr(update_cmd.sys, "executable", str(running_python))
    monkeypatch.setattr(
        "hermes_cli.sqlite_runtime.probe_sqlite_runtime",
        lambda python: observed.append(Path(python)) or vulnerable,
    )

    safe, info = update_cmd._post_update_sqlite_runtime_status()

    assert observed == [running_python]
    assert safe is False
    assert info is vulnerable


def test_summary_withholds_success_when_sqlite_remediation_failed(capsys, monkeypatch):
    monkeypatch.setattr(
        update_cmd,
        "_post_update_sqlite_runtime_status",
        lambda: (False, SimpleNamespace(sqlite_version_string="3.46.1")),
        raising=False,
    )
    monkeypatch.setattr(
        update_cmd_maint,
        "_post_update_sqlite_runtime_status",
        lambda: (False, SimpleNamespace(sqlite_version_string="3.46.1")),
        raising=False,
    )
    monkeypatch.setattr(
        update_cmd,
        "_update_complete_message",
        lambda _version: "✓ Update complete! (v0.20.5)",
    )
    monkeypatch.setattr(
        update_cmd_maint,
        "_update_complete_message",
        lambda _version: "✓ Update complete! (v0.20.5)",
    )

    complete = update_cmd._print_update_summary(
        node_failures=[],
        desktop_build_ok=True,
        pre_update_version="0.20.4",
    )

    out = capsys.readouterr().out
    assert complete is False
    assert "Update complete" not in out
    assert "SQLite (3.46.1)" in out
    assert "WAL" not in out
    assert "venv" not in out
    assert "install.sh | bash" in out
    assert "hermes doctor" in out


def test_sqlite_partial_message_is_shared_and_names_windows_installer(capsys, monkeypatch):
    """Both partial-completion paths print the same fix, and Windows gets the PowerShell one-liner."""
    for module in (update_cmd, update_cmd_maint):
        monkeypatch.setattr(
            module,
            "_post_update_sqlite_runtime_status",
            lambda: (False, SimpleNamespace(sqlite_version_string="3.46.1")),
        )
    monkeypatch.setattr(update_cmd._m(), "_is_windows", lambda: True)

    update_cmd._print_verified_update_completion("✓ Update complete!")
    verified_out = capsys.readouterr().out
    update_cmd._print_update_summary(node_failures=[], desktop_build_ok=True, pre_update_version=None)
    summary_out = capsys.readouterr().out

    for out in (verified_out, summary_out):
        assert "known corruption bug" in out
        assert "install.ps1" in out
        assert "install.sh" not in out
        assert "hermes doctor" in out
    fix_line = next(line for line in verified_out.splitlines() if "install.ps1" in line)
    assert fix_line in summary_out.splitlines()


def test_current_checkout_completion_is_verified_before_success(capsys, monkeypatch):
    monkeypatch.setattr(
        update_cmd,
        "_post_update_sqlite_runtime_status",
        lambda: (False, SimpleNamespace(sqlite_version_string="3.46.1")),
    )
    monkeypatch.setattr(
        update_cmd_maint,
        "_post_update_sqlite_runtime_status",
        lambda: (False, SimpleNamespace(sqlite_version_string="3.46.1")),
    )

    complete = update_cmd._print_verified_update_completion("✓ Already up to date!")

    out = capsys.readouterr().out
    assert complete is False
    assert "Already up to date" not in out
    assert "SQLite (3.46.1)" in out
    assert "hermes doctor" in out


def test_current_checkout_repair_returns_verified_completion_result(monkeypatch):
    monkeypatch.setattr(update_cmd, "_update_node_dependencies", lambda: [])
    monkeypatch.setattr(update_cmd_deps, "_update_node_dependencies", lambda: [])
    monkeypatch.setattr(update_cmd._m(), "_build_web_ui", lambda _path: None)
    monkeypatch.setattr(
        update_cmd,
        "_rebuild_desktop_after_update",
        lambda _dir, **_kwargs: True,
    )
    monkeypatch.setattr(
        update_cmd_deps,
        "_rebuild_desktop_after_update",
        lambda _dir, **_kwargs: True,
    )

    complete = update_cmd._repair_node_deps_on_current_checkout(
        lambda _message: False
    )

    assert complete is False
