############################################################################
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
############################################################################
import re

import atf


def setup_module():
    atf.require_version(
        (26, 5),
        "bin/strigger",
        reason="Ticket 22180: SLUID availability added in 26.05+",
    )
    atf.require_nodes(1, [("CPUs", 1)])
    atf.require_slurm_running()


def test_strigger_sluid():
    """Verify strigger --set/--get/--clear work with a SLUID as --jobid."""

    # Create a dummy trigger program
    trigger_script = atf.module_tmp_path / "fini_trigger.sh"
    atf.make_bash_script(trigger_script, "true")

    job_id = atf.submit_job_sbatch("-n1 --wrap 'srun sleep infinity'", fatal=True)
    atf.wait_for_job_state(job_id, "RUNNING", fatal=True)

    sluid = atf.get_job_parameter(job_id, "SLUID")
    assert sluid is not None, f"Job {job_id} has no SLUID"

    # Set a trigger by SLUID
    atf.run_command(
        f"strigger --set --jobid={sluid} --fini --program={trigger_script}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Get triggers by SLUID and verify
    output = atf.run_command_output(
        f"strigger --get --jobid={sluid}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    assert re.search(
        r"\bjob\b", output
    ), f"Expected RES_TYPE 'job' in strigger output: {output}"
    assert re.search(
        rf"\b{job_id}\b", output
    ), f"Expected RES_ID {job_id} in strigger output: {output}"
    assert re.search(
        r"\bfini\b", output
    ), f"Expected TYPE 'fini' in strigger output: {output}"
    assert re.search(
        rf"{re.escape(str(trigger_script))}", output
    ), f"Expected program path in strigger output: {output}"

    # Clear the trigger by SLUID
    atf.run_command(
        f"strigger --clear --jobid={sluid}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )

    # Verify trigger is gone
    output = atf.run_command_output(f"strigger --get --jobid={sluid}", fatal=True)
    assert not re.search(
        rf"\b{job_id}\b", output
    ), f"Expected no trigger for job {job_id} after clear: {output}"
