"""Predefined well-known topologies."""

from __future__ import annotations

from enum import unique
from typing import final

from pytest_mh import KnownTopologyBase, KnownTopologyGroupBase, Topology, TopologyDomain, TopologyMark

__all__ = [
    "KnownTopology",
    "KnownTopologyGroup",
]


@final
@unique
class KnownTopology(KnownTopologyBase):
    """
    Well-known topologies that can be given to ``pytest.mark.topology``
    directly. It is expected to use these values in favor of providing
    custom marker values.

    .. code-block:: python
        :caption: Example usage

        @pytest.mark.topology(KnownTopology.Shadow)
        def test_ldap(shadow: Shadow):
            assert True
    """

    Shadow = TopologyMark(
        name="shadow",
        topology=Topology(TopologyDomain("shadow", shadow=1)),
        fixtures=dict(shadow="shadow.shadow[0]"),
    )

    ShadowPrivileged = TopologyMark(
        name="shadow-privileged",
        topology=Topology(TopologyDomain("shadow-privileged", shadow=1)),
        fixtures=dict(shadow="shadow-privileged.shadow[0]"),
    )


class KnownTopologyGroup(KnownTopologyGroupBase):
    """
    Groups of well-known topologies that can be given to ``pytest.mark.topology``
    directly. It is expected to use these values in favor of providing
    custom marker values.

    The test is parametrized and runs multiple times, once per each topology.

    .. code-block:: python
        :caption: Example usage (runs on Shadow topology)

        @pytest.mark.topology(KnownTopologyGroup.AnyProvider)
        def test_ldap(shadow: Shadow):
            assert True
    """

    AnyProvider = [KnownTopology.Shadow]
