#! /usr/bin/env python
"""Demonstration project for :meth:`waves.scons_extensions.parameter_study_sconcript` wrapped SConscript calls.

Contains examples of calling SConscript without a study, with a study dictionary, and with a study parameter generator.
Constains an example of using parameter set names as build subdirectories and as direct variant directories.

.. code-block::
   :caption: bash

   $ scons .
   $ find . -name "*.h5"
   ./build_parameter_studies/build_study.h5
   ./build_parameter_studies/study.h5
   ./build_parameter_studies/subdir_study.h5
   $ find . -name "echo*.txt"
   ./echo_no_study.txt
   ./build_with_subdirs/subdir_study0/echo_subdir_study0.txt
   ./build_with_subdirs/subdir_study1/echo_subdir_study1.txt
   ./echo_study1.txt
   ./echo_study0.txt
   ./build_study0/echo_build_study0.txt
   ./build/echo_no_study.txt
   ./build/echo_study1.txt
   ./build/echo_study0.txt
   ./build/echo_dictionary.txt
   ./build_study1/echo_build_study1.txt
   ./echo_dictionary.txt

.. code-block::
   :caption: pwsh

   PS > scons .
   PS > Get-ChildItem -Recurse -Filter "*.h5"
   PS > Get-ChildItem -Recurse -Filter "echo*.txt"
"""
import os
import pathlib

import waves

env = waves.scons_extensions.WAVESEnvironment(ENV=os.environ.copy())
parameter_study_directory = pathlib.Path("build_parameter_studies")

# =========================================================================================== COMMON BUILD DIRECTORY ===
# Call with and without a variant directory
for variant_dir in [None, "build"]:
    # Call without a study
    #
    # Produces
    # ./echo_no_study.txt
    # ./build/echo_no_study.txt
    study = None
    simulation_variables = {"workflow": "no study"}
    env.ParameterStudySConscript(
        "SConscript",
        variant_dir=variant_dir,
        exports={"env": env},
        duplicate=True,
        study=study,
        set_name="no_study",
        parameters=simulation_variables,
    )

    # Call with a study dictionary
    #
    # Produces
    # ./echo_dictionary.txt
    # ./build/echo_dictionary.txt
    study = {"workflow": "dictionary"}
    simulation_variables = {}
    env.ParameterStudySConscript(
        "SConscript",
        variant_dir=variant_dir,
        exports={"env": env},
        duplicate=True,
        study=study,
        set_name="dictionary",
    )

    # Call with a study parameter generator
    #
    # Produces
    # ./echo_study0.txt
    # ./echo_study1.txt
    # ./build/echo_study0.txt
    # ./build/echo_study1.txt
    study_file = parameter_study_directory / "study.h5"
    study = waves.parameter_generators.CartesianProduct(
        {"workflow": ["thing 1", "thing 2"]},
        set_name_template=f"{study_file.stem}@number",
        output_file=study_file,
        previous_parameter_study=study_file,
    )
    study.write()
    simulation_variables = {}
    env.ParameterStudySConscript(
        "SConscript",
        variant_dir=variant_dir,
        exports={"env": env},
        duplicate=True,
        study=study,
    )

# ===================================================================================== PARAMETER SET SUBDIRECTORIES ===
# Call with a variant directory and parameter set named subdirectories. Probably if you knew you were going to use the
# SConscript file this way, you would remove the ``set_name`` variable in the target file name construction.
#
# Produces
# ./build_with_subdirs/subdir_study0/echo_subdir_study0.txt
# ./build_with_subdirs/subdir_study1/echo_subdir_study1.txt
study_file = parameter_study_directory / "subdir_study.h5"
study = waves.parameter_generators.CartesianProduct(
    {"workflow": ["thing 3", "thing 4"]},
    set_name_template=f"{study_file.stem}@number",
    output_file=study_file,
    previous_parameter_study=study_file,
)
study.write()
simulation_variables = {}
env.ParameterStudySConscript(
    "SConscript",
    variant_dir=f"build_with_subdirs",
    exports={"env": env},
    duplicate=True,
    study=study,
    subdirectories=True,
)

# ================================================================================== PARAMETER SET BUILD DIRECTORIES ===
# Call without a variant directory and parameter set named subdirectories. Probably if you knew you were going to use
# the SConscript file this way, you would remove the ``set_name`` variable in the target file name construction.
#
# Produces
# ./build_study0/echo_build_study0.txt
# ./build_study1/echo_build_study1.txt
study_file = parameter_study_directory / "build_study.h5"
study = waves.parameter_generators.CartesianProduct(
    {"workflow": ["thing 5", "thing 6"]},
    set_name_template=f"{study_file.stem}@number",
    output_file=study_file,
    previous_parameter_study=study_file,
)
study.write()
simulation_variables = {}
env.ParameterStudySConscript(
    "SConscript",
    variant_dir=None,
    exports={"env": env},
    duplicate=True,
    study=study,
    subdirectories=True,
)

env.ProjectHelp()
