from __future__ import annotations

import sys
from pathlib import Path

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

from chekan.accept import detect, load_profiles, resolve_command


import json


def _setup_valid_onec_project(root: Path) -> Path:
    db_dir = root / "test_ib"
    db_dir.mkdir(exist_ok=True)
    (db_dir / ".chekan-testbase").touch()
    cfg = {"ibconnection": f"/F{db_dir}", "v8version": "8.3.27.1859"}
    (root / "chekan-1c.json").write_text(json.dumps(cfg), encoding="utf-8")
    return db_dir


def test_detect_onec_profile(tmp_path: Path) -> None:
    """1С-проекты (обработки, epf, erf, 1c) получают профиль onec."""
    onec_dir = tmp_path / "обработки_экспорт"
    onec_dir.mkdir()
    profile = detect(onec_dir)
    assert profile["id"] == "onec"
    assert "vrunner run --command \"RunUnitTests\"" in profile["checks"]
    assert profile["skill"] == "1c-testbench"
    assert "файловая база" in profile["note"]
    # Нота обязана называть непроверенное: UI-тесты Vanessa на macOS виснут.
    assert "НЕ доказано" in profile["note"]


def test_resolve_onec_command_fails_without_chekan_1c_json(tmp_path: Path) -> None:
    """Без chekan-1c.json команда 1С блокируется замком."""
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert "exit 1" in cmd
    assert "назовите базу в chekan-1c.json" in cmd


def test_resolve_onec_command_with_custom_script(tmp_path: Path) -> None:
    """Если в 1С-проекте есть chekan-1c.json и свой run_tests.sh — команда берётся из него."""
    _setup_valid_onec_project(tmp_path)
    script = tmp_path / "run_tests.sh"
    script.write_text("#!/bin/bash\necho 'tests ok'\n", encoding="utf-8")
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert cmd == "./run_tests.sh"


def test_resolve_onec_command_with_yaxunit_config(tmp_path: Path) -> None:
    """Если есть yaxunit.json — генерируется вызов vrunner с параметрами базы."""
    _setup_valid_onec_project(tmp_path)
    cfg = tmp_path / "yaxunit.json"
    cfg.write_text('{"reportFormat": "jUnit"}', encoding="utf-8")
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert "RunUnitTests=yaxunit.json" in cmd
    assert "8.3.27.1859" in cmd
    assert "/F" in cmd


def test_onec_no_tests_fails_red(tmp_path: Path) -> None:
    """Если база валидна, но тестов в проекте нет вообще — возврат exit 1."""
    _setup_valid_onec_project(tmp_path)
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert "exit 1" in cmd
    assert "не найдены тесты" in cmd


def test_vanessa_settings_refused_not_launched(tmp_path: Path) -> None:
    """VAParams.json — отказ с внятным текстом, а не зависающий vrunner vanessa.

    Прогон `vrunner vanessa` открывает интерактивный клиент 1С и ждёт человека:
    проверка не краснеет и не зеленеет, а висит. Молчаливое зависание хуже отказа.
    """
    _setup_valid_onec_project(tmp_path)
    (tmp_path / "VAParams.json").write_text('{"FeaturesPath": "features"}', encoding="utf-8")
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert "vrunner vanessa" not in cmd
    assert "exit 1" in cmd
    assert "VAParams.json" in cmd


def test_features_dir_refused_not_launched(tmp_path: Path) -> None:
    """Каталог features/ с .feature — тот же отказ."""
    _setup_valid_onec_project(tmp_path)
    fdir = tmp_path / "features"
    fdir.mkdir()
    (fdir / "smoke.feature").write_text("Функционал: Проверка формы\n", encoding="utf-8")
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert "vrunner vanessa" not in cmd
    assert "exit 1" in cmd


def test_yaxunit_wins_over_vanessa(tmp_path: Path) -> None:
    """Есть и то и другое — берём доказанный путь, модульные тесты."""
    _setup_valid_onec_project(tmp_path)
    (tmp_path / "VAParams.json").write_text("{}", encoding="utf-8")
    (tmp_path / "yaxunit.json").write_text("{}", encoding="utf-8")
    cmd = resolve_command("vrunner run --command \"RunUnitTests\"", tmp_path)
    assert 'RunUnitTests=yaxunit.json' in cmd
    assert "vrunner vanessa" not in cmd


def test_onec_corruption_lever(tmp_path: Path) -> None:
    """Рычаг порчи: обычный питоновский/веб проект не должен ложно распознаваться как 1С."""
    generic_dir = tmp_path / "my_regular_project"
    generic_dir.mkdir()
    profile = detect(generic_dir)
    assert profile["id"] != "onec"

