from __future__ import annotations

import importlib.util
import subprocess
from pathlib import Path


MODULE = Path(__file__).resolve().parents[1] / "k3s_job_runner.py"
spec = importlib.util.spec_from_file_location("k3s_job_runner", MODULE)
k3s_job_runner = importlib.util.module_from_spec(spec)
assert spec.loader is not None
spec.loader.exec_module(k3s_job_runner)


def test_runner_streams_agent_logs_and_returns_its_exit_code(monkeypatch):
    pods = iter([
        {"metadata": {"name": "cdx-pod"}, "status": {"containerStatuses": [
            {"name": "agent", "state": {"running": {}}},
        ]}},
        {"metadata": {"name": "cdx-pod"}, "status": {"containerStatuses": [
            {"name": "agent", "state": {"terminated": {"exitCode": 17}}},
        ]}},
    ])
    monkeypatch.setattr(k3s_job_runner, "get_pod", lambda *args: next(pods))
    commands = []

    def fake_run(argv, **kwargs):
        commands.append(argv)
        return subprocess.CompletedProcess(argv, 0)

    monkeypatch.setattr(k3s_job_runner.subprocess, "run", fake_run)
    assert k3s_job_runner.run("overdeck", None, "cdx-job", 30) == 17
    assert commands == [[
        "kubectl", "--namespace", "overdeck", "logs", "-f", "cdx-pod", "-c", "agent",
    ]]


def test_log_stream_failure_keeps_supervising_until_agent_terminates(monkeypatch, capsys):
    pods = iter([
        {"metadata": {"name": "cdx-pod"}, "status": {"containerStatuses": [
            {"name": "agent", "state": {"running": {}}},
        ]}},
        {"metadata": {"name": "cdx-pod"}, "status": {"containerStatuses": [
            {"name": "agent", "state": {"terminated": {"exitCode": 0}}},
        ]}},
    ])
    monkeypatch.setattr(k3s_job_runner, "get_pod", lambda *args: next(pods))
    monkeypatch.setattr(
        k3s_job_runner.subprocess,
        "run",
        lambda argv, **kwargs: subprocess.CompletedProcess(argv, 1),
    )

    assert k3s_job_runner.run("overdeck", None, "cdx-job", 30) == 0
    assert "log stream detached" in capsys.readouterr().err


def test_fatal_waiting_state_fails_immediately(monkeypatch):
    pod = {"status": {"containerStatuses": [{"name": "agent", "state": {"waiting": {
        "reason": "ImagePullBackOff",
    }}}]}}
    assert k3s_job_runner.startup_failure(pod) == "agent: ImagePullBackOff"
    assert k3s_job_runner.agent_status(pod) == ("waiting", None)
