#! /usr/bin/env python
import os
import pathlib

import waves

import scons_extensions


AddOption(
    "--build-dir",
    dest="variant_dir_base",
    default="build",
    nargs=1,
    type="string",
    action="store",
    metavar="DIR",
    help="SCons build (variant) root directory. Relative or absolute path. (default: '%default')",
)
AddOption(
    "--solve-cpus",
    dest="solve_cpus",
    default=1,
    nargs=1,
    type="int",
    action="store",
    metavar="N",
    help="Run the solver task using N CPUs. (default: '%default')",
)

env = waves.scons_extensions.WAVESEnvironment(
    ENV=os.environ.copy(),
    variant_dir_base=pathlib.Path(GetOption("variant_dir_base")),
    solve_cpus=GetOption("solve_cpus"),
)
env["ENV"]["PYTHONDONTWRITEBYTECODE"] = 1

# Print failed task *.stdout files
env.PrintBuildFailures()

# Empty defaults list to avoid building all simulation targets by default
env.Default()

# Add project builders and scanners
solver_executable = pathlib.Path("solver.py").resolve()
env["solver"] = env.AddProgram([solver_executable])

# Users should typically rely on AddProgram behavior for third-party software as above, which checks for execute
# permissions and PATH resolution. If a tutorial user forgets to change the execute permissions on Linux, or is running
# on Windows, force execution with the Python interpretter and absolute path.
#
# VVV Code specific to making tutorial execution more robust VVV
if env["solver"] is None:
    env["solver"] = f"python {solver_executable}"
# ^^^ Code specific to making tutorial execution more robust ^^^

env.Append(
    BUILDERS={
        "Solver": scons_extensions.solver_builder_factory(
            program=env["solver"], subcommand_options="$(--solve-cpus=${solve_cpus}$)"
        ),
    }
)

# Add simulation targets
workflow_configurations = [
    "pytest",
    "implicit_workflow",
]
for workflow in workflow_configurations:
    build_dir = env["variant_dir_base"] / workflow
    SConscript(workflow, variant_dir=build_dir, exports={"env": env}, duplicate=False)

# Print project local help
env.ProjectHelp()
