"""Проверка отображения брифа на панели прогона и очистки short_title (R06, R07, R08i).

Рычаги порчи:
1. Убрать fetch('brief.md') из dashboard.html — покраснеет `test_dashboard_html_fetches_and_renders_brief`.
2. Вернуть искусственную обрезку в manifest.short_title — покраснеет `test_manifest_short_title_clean`.
"""

from __future__ import annotations

import re
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 dash, manifest  # 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)

    brief_text = (
        "Полный и подробный бриф прогона, который должен отображаться в подзаголовке карточки на странице прогона."
    )
    r = Run.create(tmp_path, "Короткое имя", "normal", "T2", brief=brief_text)
    return tmp_path


def test_dashboard_html_fetches_and_renders_brief():
    """assets/dashboard.html запрашивает brief.md и подставляет его в #sub."""
    src = (ROOT / "assets" / "dashboard.html").read_text(encoding="utf-8")
    assert 'fetch("brief.md' in src or "fetch('brief.md" in src, "dashboard.html не запрашивает brief.md"
    assert "el(\"sub\").textContent = full" in src, "dashboard.html не устанавливает текст брифа в #sub"


def test_dashboard_page_generated_with_brief(repo: Path):
    """Сгенерированная страница дашборда содержит элементы подзаголовка и разметку."""
    run = Run.load(repo)
    dash_file = dash.build_page(run)
    assert dash_file.is_file()
    content = dash_file.read_text(encoding="utf-8")
    assert '<p class="sub" id="sub">' in content or '<p class="sub" id="sub"></p>' in content
    assert (run.dir / "brief.md").is_file()
    assert "Полный и подробный бриф" in (run.dir / "brief.md").read_text(encoding="utf-8")


def test_manifest_short_title_clean():
    """short_title не содержит мёртвого кода с обрезкой по 74 символам и многоточием."""
    assert not hasattr(manifest, "TITLE_LIMIT"), "TITLE_LIMIT остался в manifest.py"
    assert not hasattr(manifest, "_SENTENCE_END"), "_SENTENCE_END остался в manifest.py"
    long_title = "Длинное имя прогона без всяких обрывов и искусственных многоточий " * 3
    res = manifest.short_title(long_title)
    assert "…" not in res, "short_title вернул многоточие"
    assert len(res) <= 60, "short_title превысил лимит"
    assert res.startswith("Длинное имя прогона")
