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


@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_accounting()
    atf.require_nodes(3, [("CPUs", 8), ("RealMemory", 80)])

    # only to make the test faster
    atf.require_config_parameter("SchedulerParameters", "bf_interval=1")

    atf.require_slurm_running()


def test_hetjob():
    file_in = "hetjob.in"
    atf.make_bash_script(
        file_in,
        """
#SBATCH --cpus-per-task=4 --mem-per-cpu=10 --ntasks=1
#SBATCH hetjob
#SBATCH --cpus-per-task=2 --mem-per-cpu=2  --ntasks=1 -t1
#SBATCH hetjob
#SBATCH --cpus-per-task=1 --mem-per-cpu=6  --ntasks=1 -t1

srun sleep 60
        """,
    )
    leader_job_id = atf.submit_job_sbatch(f"-t1 {file_in}", fatal=True)
    atf.wait_for_job_state(leader_job_id, "RUNNING", fatal=True)

    jobs_dict = atf.get_jobs()

    # Verify details about leader job
    assert leader_job_id in jobs_dict
    leader_job_dict = jobs_dict[leader_job_id]
    assert leader_job_dict["JobId"] == leader_job_id
    assert leader_job_dict["HetJobId"] == leader_job_id
    assert leader_job_dict["HetJobOffset"] == 0
    het_job_expression = leader_job_dict["HetJobIdSet"]
    assert re.search(r"[\d,-]+", het_job_expression) is not None
    assert leader_job_dict["CPUs/Task"] == 4
    assert leader_job_dict["MinMemoryCPU"] == "10M"
    het_job_component_list = atf.range_to_list(het_job_expression)
    het_job_component_list.remove(leader_job_id)
    assert len(het_job_component_list) == 2

    # Verify details about first component job
    component1_job_id = het_job_component_list[0]
    assert component1_job_id in jobs_dict
    component1_job_dict = jobs_dict[component1_job_id]
    assert component1_job_dict["JobId"] == component1_job_id
    assert component1_job_dict["HetJobId"] == leader_job_id
    assert component1_job_dict["HetJobOffset"] == 1
    assert re.search(r"[\d,-]+", component1_job_dict["HetJobIdSet"]) is not None
    assert component1_job_dict["CPUs/Task"] == 2
    assert component1_job_dict["MinMemoryCPU"] == "2M"

    # Verify details about second component job
    component2_job_id = het_job_component_list[1]
    assert component2_job_id in jobs_dict
    component2_job_dict = jobs_dict[component2_job_id]
    assert component2_job_dict["JobId"] == component2_job_id
    assert component2_job_dict["HetJobId"] == leader_job_id
    assert component2_job_dict["HetJobOffset"] == 2
    assert re.search(r"[\d,-]+", component2_job_dict["HetJobIdSet"]) is not None
    assert component2_job_dict["CPUs/Task"] == 1
    assert component2_job_dict["MinMemoryCPU"] == "6M"
