"""Проверка полного покрытия проверок рычагами порчи (R09, R10i, R11i).

Рычаги порчи:
1. Отключить связь рычага с проверкой в runner.py — покраснеет `test_checks_with_levers_are_fully_covered`.
2. Не засчитывать ненулевой код рычага — покраснеет `test_red_lever_counts_as_valid_coverage`.
"""

from __future__ import annotations

import subprocess
import sys
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT))

from chekan import proof, runner  # noqa: E402
from chekan.store import Run  # noqa: E402


@pytest.fixture
def repo(tmp_path: Path) -> Path:
    subprocess.run(["git", "init", "-q"], cwd=tmp_path, check=True)
    subprocess.run(["git", "config", "user.email", "t@t"], cwd=tmp_path, check=True)
    subprocess.run(["git", "config", "user.name", "t"], cwd=tmp_path, check=True)
    (tmp_path / "app.py").write_text("print('ok')\n", encoding="utf-8")
    subprocess.run(["git", "add", "-A"], cwd=tmp_path, check=True)
    subprocess.run(["git", "commit", "-qm", "init"], cwd=tmp_path, check=True)

    r = Run.create(tmp_path, "Тестовый прогон рычагов", "normal", "T2")
    r.add_requirement("R09", "цитата", "причина")
    r.add_task("01", "Первая задача", ["R09"], zone="app.py", verify="true")
    return tmp_path


def test_check_without_lever_is_reported(repo: Path):
    """Проверка без рычага порчи попадает в список missing и строку отчёта."""
    run = Run.load(repo)
    proof.run_command(run, "true", task="01")
    missing = runner.checks_without_lever(run)
    assert len(missing) == 1
    assert missing[0]["task"] == "01"
    assert missing[0]["cmd"] == "true"
    assert "Проверок без рычага порчи: 1" in runner.report_line(run)


def test_red_lever_counts_as_valid_coverage(repo: Path):
    """Прогон с красным рычагом (код выхода != 0) полностью закрывает проверку."""
    run = Run.load(repo)
    row = proof.run_command(run, "true", task="01")
    lrow = runner.run_lever(run, "false", row, task="01")
    assert lrow["exit"] != 0
    assert runner.is_red(lrow)

    missing = runner.checks_without_lever(run)
    assert missing == []
    assert runner.report_line(run) == "Проверок без рычага порчи: 0 — каждую зелёную проверку кто-то ломал."


def test_green_lever_fails_to_cover_check(repo: Path):
    """Зелёный рычаг (код выхода 0) не доказывает поломку и не засчитывается."""
    run = Run.load(repo)
    row = proof.run_command(run, "true", task="01")
    lrow = runner.run_lever(run, "true", row, task="01")
    assert lrow["exit"] == 0
    assert not runner.is_red(lrow)

    missing = runner.checks_without_lever(run)
    assert len(missing) == 1
    assert "Проверок без рычага порчи: 1" in runner.report_line(run)
