#! /usr/bin/env python

import os
import pathlib

import waves

# Comments used in tutorial code snippets: marker-1

# Accept command line options with fall back default values
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(
    "--unconditional-build",
    dest="unconditional_build",
    default=False,
    action="store_true",
    help="Boolean flag to force building of conditionally ignored targets, e.g. if the target's action program is missing" \
            " and it would normally be ignored. (default: '%default')"
)

# Comments used in tutorial code snippets: marker-2

# Inherit user's full environment and set project variables
env = Environment(ENV=os.environ.copy(),
                  variant_dir_base=GetOption("variant_dir_base"),
                  unconditional_build=GetOption("unconditional_build"))

# Comments used in tutorial code snippets: marker-3

# Find required programs for conditional target ignoring and absolute path for use in target actions
env['abaqus'] = waves.scons_extensions.add_program(["/apps/abaqus/Commands/abq2023", "abq2023"], env)

# Comments used in tutorial code snippets: marker-4

# Set project internal variables and variable substitution dictionaries
project_name = 'WAVES-TUTORIAL'
version = '0.1.0'
project_dir = pathlib.Path(Dir(".").abspath)
abaqus_source_dir = "eabm_package/abaqus"
project_variables = {
    'project_name': project_name,
    'project_dir': str(project_dir),
    'version': version,
    'abaqus_source_abspath': str(project_dir / abaqus_source_dir)
}
for key, value in project_variables.items():
    env[key] = value

# Make the EABM package importable for Python and Abaqus Python environments
env.PrependENVPath("PYTHONPATH", str(project_dir))

# Comments used in tutorial code snippets: marker-5

# Build path object for extension and re-use
variant_dir_base = pathlib.Path(env['variant_dir_base'])

# Add custom builders
env.Append(BUILDERS={'AbaqusJournal': waves.scons_extensions.abaqus_journal(program=env['abaqus'])})

# Comments used in tutorial code snippets: marker-6

# Add simulation targets
workflow_configurations = [
    'tutorial_01_geometry',
    'tutorial_02_partition_mesh',
    'tutorial_03_solverprep'
]
for workflow in workflow_configurations:
    build_dir = variant_dir_base / workflow
    SConscript(workflow, variant_dir=build_dir, exports='env', duplicate=False)

# Comments used in tutorial code snippets: marker-7

# Add default target list to help message
env.Default()  # Empty defaults list to avoid building all simulation targets by default
# Add aliases to help message so users know what build target options are available
# This must come *after* all expected Alias definitions and SConscript files.
waves.scons_extensions.project_help_message()

# Comments used in tutorial code snippets: marker-8
