from __future__ import annotations

import os
import traceback
from typing import Any, Callable
import allure  # pyright: ignore[reportMissingImports]
from allure_commons.types import AttachmentType  # pyright: ignore[reportMissingImports]


def before_scenario(context: Any, scenario: Any) -> None:  # noqa: ARG001
    # behave context не типизирован, поэтому сохраняем список без аннотации справа (pyright ругается).
    context._cleanup_fns = []  # type: ignore[attr-defined]

    # GraphQL endpoint выбирается в worklib.graphql_client.execute_graphql:
    # - явный аргумент graphql_url
    # - env GRAPHQL_URL
    # - DEFAULT_GRAPHQL_URL
    #
    # Для Mockoon (proxy или чистый mock) достаточно перед запуском тестов выставить:
    #   GRAPHQL_URL=http://localhost:8080/graphql
    #
    # Если пользователь выставил env USE_MOCKOON=1, аккуратно подменим GRAPHQL_URL,
    # но не трогаем его, если он уже задан явно.
    if os.getenv("USE_MOCKOON") in {"1", "true", "True"} and not os.getenv("GRAPHQL_URL"):
        os.environ["GRAPHQL_URL"] = "http://localhost:8080/graphql"
    context.graphql_url = os.getenv("GRAPHQL_URL")
    
def after_scenario(context: Any, scenario: Any) -> None:  # noqa: ARG001
    cleanup_fns: list[Callable[[], None]] = getattr(context, "_cleanup_fns", [])
    while cleanup_fns:
        fn = cleanup_fns.pop()
        try:
            with allure.step(f"Cleanup: {getattr(fn, '__name__', 'cleanup')}"):
                fn()
        except Exception:
            allure.attach(
                traceback.format_exc(),
                name="Cleanup error",
                attachment_type=AttachmentType.TEXT,
            )

