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

import re

# import os
import pytest

import atf

file_in = "input"
job_ids = []

# Different argument and behavior combinations to test:
# args, scontrol, xfail, files.
testing_combinations = [
    (["--job-name='TEST_NAME'"], ["JobName=TEST_NAME"], [], []),
    (["-N1000000k"], [], ["More processors requested than permitted"], []),
    (["-N650000"], [], ["More processors requested than permitted"], []),
    ([r"-o 'spaces\ out'"], [], [], ["spaces out"]),
    ([r"-e 'spaces\ err'"], [], [], ["spaces err"]),
]


@pytest.fixture(scope="module", autouse=True)
def setup():
    # We need jobs to fail if given crazy requirements
    atf.require_config_parameter("EnforcePartLimits", "ALL")
    atf.require_slurm_running()

    yield

    # Manually cancel job at the end because we're not using atf.submit_job_sbatch
    atf.cancel_jobs(job_ids)


# Create job script that includes each SBATCH directive in sbatch_args
def sbatch_script(sbatch_args):
    atf.make_bash_script(
        file_in, "\n".join([f"#SBATCH {s_arg}" for s_arg in sbatch_args]) + "\nid"
    )


# Test each set of SBATCH argument combinations and the expected behavior
@pytest.mark.parametrize("args,scontrol,xfail,files", testing_combinations)
def test_sbatch_directive(args, scontrol, xfail, files):
    # Create and submit job
    sbatch_script(args)
    submission_results = atf.run_command(f"sbatch {file_in}", xfail=xfail)

    # Extract the job id
    job_id_match = re.search(r"Submitted \S+ job (\d+)", submission_results["stdout"])
    job_id = int(job_id_match.group(1)) if job_id_match else 0
    job_ids.append(job_id)

    # Test appropriately if job submission failed
    if xfail:
        assert (
            job_id == 0
        ), f"Job submission was supposed to fail with sbatch args {args}"
        for fail_text in xfail:
            assert (
                fail_text in submission_results["stderr"]
            ), f"Text '{fail_text}' not found in stderr of sbatch command"
        return
    else:
        assert (
            job_id
        ), f"Job submission failed when not expected to with sbatch args {args}"

    # Test "scontrol show job" info matches expectations
    scontrol_info = atf.run_command_output(f"scontrol show job {job_id}", fatal=True)
    for job_property in scontrol:
        assert (
            job_property in scontrol_info
        ), f"'{job_property}' not found in scontrol show"

    # Test if files specified now exist
    for file in files:
        assert atf.wait_for_file(file), f"File {file} should be created"
