############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
# import re
import json
import os
import pwd

import pytest

import atf


@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_auto_config("wants to load a user into the accounting database")
    atf.require_accounting(modify=True)
    atf.require_config_parameter("Parameters", "PreserveCaseUser", source="dbd")
    atf.require_slurm_running()


@pytest.fixture(scope="module")
def setup_account():
    test_user = pwd.getpwuid(os.getuid())[0]
    atf.run_command(
        "sacctmgr -vi add account test_account",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    atf.run_command(
        f"sacctmgr -vi add user {test_user} account=test_account AdminLevel=Admin",
        user=atf.properties["slurm-user"],
        fatal=True,
    )


def test_PreserveCaseUser_on(setup_account):
    """Verify text case is preserved on the imported user name"""

    config_file = f"{atf.module_tmp_path}/my_cluster.cfg"
    user = "Test.User"
    config_text = f"""
Cluster - atf
User - {user}:DefaultAccount=test_account
"""
    with open(config_file, "w") as f:
        f.writelines(config_text)

    atf.run_command(f"sacctmgr -inQ load {config_file} clean", fatal=True)
    user_out = atf.run_command_output(
        f"sacctmgr list user {user} format=User -nP"
    ).rstrip()
    assert (
        user_out == user
    ), f"Case was not be preserved for imported user name ({user_out})"


def test_PreserveCaseAll_sets_case_flags():
    """Verify PreserveCaseAll enables every preserve-case connection flag"""

    atf.require_version(
        (26, 11),
        "sbin/slurmdbd",
        reason="PreserveCaseAll was added in 26.11",
    )
    atf.require_version(
        (26, 11),
        "bin/sacctmgr",
        reason="PreserveCaseAll JSON validation requires 26.11 sacctmgr",
    )

    atf.set_config_parameter("Parameters", "PreserveCaseAll", source="slurmdbd")

    expected_flags = {"PreserveCaseResource", "PreserveCaseUser"}
    output = atf.run_command_output(
        "sacctmgr --json show configuration",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    config = json.loads(output)["slurmdbd_conf"]
    flags = set(config.get("PersistConnFlags", []))

    assert (
        expected_flags <= flags
    ), f"PreserveCaseAll did not set all flags. Expected superset of {expected_flags}, got {flags}"
