"""Shared utilities for Robot Framework helper scripts.

This module centralises the ``reset_global_state()`` function used by
``helper_m4_e2e_verification.py`` (and its sub-modules
``helper_m4_e2e_common.py``, ``helper_m4_e2e_domain.py``,
``helper_m4_e2e_cli.py``),
``helper_m4_correction_subplan_smoke.py``, and
``helper_m3_decision_validation_smoke.py``.

Any helper script invoked via ``Run Process`` from a ``.robot`` suite
can import this module to reset process-wide singletons between
chained CLI invocations.
"""

import contextlib
import sys


def reset_global_state() -> None:
    """Reset process-wide singletons between CLI invocations.

    Clears the Settings singleton, DI container, provider registry,
    and in-memory SQLAlchemy engine cache so that chained CLI
    invocations within the same helper process do not carry stale
    state.

    Each import is guarded by ``contextlib.suppress(ImportError)``
    because this module lives in ``robot/`` and may be loaded in
    contexts where not all application modules are on the path
    (e.g. a minimal helper that only exercises domain models).
    This is an intentional exception to the top-of-file import rule
    per CONTRIBUTING.md §Import Guidelines.
    """
    # Settings singleton
    with contextlib.suppress(ImportError):
        from cleveragents.config.settings import Settings

        Settings._instance = None

    # DI container singleton
    with contextlib.suppress(ImportError):
        from cleveragents.application.container import reset_container

        reset_container()

    # Provider registry singleton
    with contextlib.suppress(ImportError):
        from cleveragents.providers.registry import reset_provider_registry

        reset_provider_registry()

    # In-memory SQLAlchemy engine cache
    with contextlib.suppress(ImportError):
        from cleveragents.infrastructure.database.engine_cache import MEMORY_ENGINES

        for _url, engine in list(MEMORY_ENGINES.items()):
            try:
                engine.dispose()
            except Exception as exc:
                print(
                    f"[helpers_common] engine.dispose() suppressed: {exc}",
                    file=sys.stderr,
                )
        MEMORY_ENGINES.clear()
