import allure
import pytest
from frostfs_testlib.shell import Shell

from pytest_tests.helpers import epoch
from pytest_tests.helpers.cluster import Cluster, StorageNode


# To skip adding every mandatory singleton dependency to EACH test function
class ClusterTestBase:
    shell: Shell
    cluster: Cluster

    @pytest.fixture(scope="session", autouse=True)
    def fill_mandatory_dependencies(self, cluster: Cluster, client_shell: Shell):
        ClusterTestBase.shell = client_shell
        ClusterTestBase.cluster = cluster
        yield

    @allure.title("Tick {epochs_to_tick} epochs")
    def tick_epochs(self, epochs_to_tick: int, alive_node: StorageNode):
        for _ in range(epochs_to_tick):
            self.tick_epoch(alive_node)

    def tick_epoch(self, alive_node: StorageNode):
        epoch.tick_epoch(self.shell, self.cluster, alive_node=alive_node)

    def wait_for_epochs_align(self):
        epoch.wait_for_epochs_align(self.shell, self.cluster)

    def get_epoch(self):
        return epoch.get_epoch(self.shell, self.cluster)

    def ensure_fresh_epoch(self):
        return epoch.ensure_fresh_epoch(self.shell, self.cluster)