############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import re

import pytest

import atf

# Global variables
qos1 = "qos1"
qos2 = "qos2"
qos3 = "qos3"
acct1 = "acct1"


@pytest.fixture(scope="module", autouse=True)
def setup():
    """Test setup with required configurations."""
    atf.require_config_parameter_includes("AccountingStorageEnforce", "associations")
    atf.require_accounting(True)
    atf.require_slurm_running()


@pytest.fixture(scope="function", autouse=True)
def setup_db():
    # Create test QOS and account
    atf.run_command(
        f"sacctmgr -i add qos {qos1},{qos2},{qos3}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -i add account {acct1}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    yield

    atf.run_command(
        f"sacctmgr -i remove account {acct1}",
        user=atf.properties["slurm-user"],
        quiet=True,
    )
    atf.run_command(
        f"sacctmgr -i remove qos {qos1},{qos2},{qos3}",
        user=atf.properties["slurm-user"],
        quiet=True,
    )


def test_qos_removal_from_comma_separated():
    """Test QOS removal between from comma separated QOSes."""

    # Add qos to acct
    atf.run_command(
        f"sacctmgr -i modify account {acct1} set qos={qos1},{qos2},{qos3}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Now del qos
    atf.run_command(
        f"sacctmgr -i remove qos {qos2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Check remaining qos
    output = atf.run_command_output(
        f"sacctmgr -ns show account {acct1} format=qos",
        fatal=True,
    )
    assert re.search(
        rf"{qos1},{qos3}", output
    ), f"Verify {qos2} is not in {acct1}, but {qos1},{qos2} are."


def test_qos_removal_from_incremental_comma_separated():
    """Test QOS removal between from incremental comma separated QOSes."""

    # Add qos to acct1
    atf.run_command(
        f"sacctmgr -i modify account {acct1} set qos+={qos1},{qos2},{qos3}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Now del qos
    atf.run_command(
        f"sacctmgr -i remove qos {qos2}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Check remaining qos
    output = atf.run_command_output(
        f"sacctmgr -ns show account {acct1} format=qos",
        fatal=True,
    )
    assert re.search(
        rf"{qos1},{qos3}", output
    ), f"Verify {qos2} is not in {acct1}, but {qos1},{qos2} are."
