#! /usr/bin/env python
"""Configure the WAVES Gmsh tutorial workflow."""

import vtu2xarray

Import("env", "alias", "parameters")

# Geometry, Partition, Mesh
env.PythonScript(
    target=["rectangle_gmsh.inp"],
    source=["rectangle.py"],
    subcommand_options="--output-file=${TARGET.abspath}",
    **parameters,
)

env.PythonScript(
    target=["rectangle_mesh.inp"],
    source=["strip_heading.py", "rectangle_gmsh.inp"],
    subcommand_options="--input-file=${SOURCES[1].abspath} --output-file=${TARGET.abspath}",
)

# SolverPrep
env.CopySubstfile(
    ["#/rectangle_compression.inp.in"],
    substitution_dictionary=env.SubstitutionSyntax(parameters),
)

# CalculiX Solve
env.CalculiX(
    target=[f"rectangle_compression.{suffix}" for suffix in ("frd", "dat", "sta", "cvg", "12d")],
    source=["rectangle_compression.inp"],
)

# Extract
time_points_source_file = env["project_directory"] / "time_points.inp"
time_points = vtu2xarray.time_points_from_file(time_points_source_file)
time_point_indices = range(1, len(time_points) + 1, 1)
vtu_files = [f"rectangle_compression.{increment:02}.vtu" for increment in time_point_indices]
env.Command(
    target=[*vtu_files, "rectangle_compression.vtu.stdout"],
    source=["rectangle_compression.frd"],
    action=["cd ${TARGET.dir.abspath} && ccx2paraview ${SOURCES[0].abspath} vtu > ${TARGETS[-1].abspath} 2>&1"],
)
env.PythonScript(
    target=["rectangle_compression.h5"],
    source=["vtu2xarray.py", "time_points.inp", vtu_files],
    subcommand_options=(
        "--input-file ${SOURCES[2:].abspath} --output-file ${TARGET.abspath} --time-points-file ${SOURCES[1].abspath}"
    ),
)


# Post-processing
target = env.PythonScript(
    target=["stress_strain.pdf", "stress_strain.csv"],
    source=["post_processing.py", "rectangle_compression.h5"],
    subcommand_options=(
        "--input-file ${SOURCES[1:].abspath} --output-file ${TARGET.abspath} --x-units mm/mm --y-units MPa"
    ),
)

# Collector alias named after the model simulation
env.Alias(alias, target)

if not env["unconditional_build"] and (not env["CCX_PROGRAM"] or not env["ccx2paraview"]):
    print(
        "Program 'CalculiX (ccx)' or 'ccx2paraview' was not found in construction environment. "
        "Ignoring 'rectangle' target(s)"
    )
    Ignore([".", alias], target)
