#!/bin/bash
# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.

if [ ! -e Project.toml ]; then
    echo "juliaw: Project.toml not found"
    exit 1
fi

if [ ! -e Manifest.toml ]; then
    julia --project=. -e 'using Pkg; Pkg.instantiate()' || exit 1
fi

if [ ! -e build/sysimage.so -o Project.toml -nt build/sysimage.so ]; then
    echo "juliaw: rebuilding system image..."

    # Generate temporary project folder
    rm -rf $HOME/.juliaw
    mkdir -p $HOME/.juliaw/src
    cp Project.toml Manifest.toml $HOME/.juliaw
    NAME=$(julia -e 'using TOML; toml = TOML.parsefile("Project.toml"); "name" in keys(toml) && print(toml["name"])')
    if [ ! -z $NAME ]; then
        cat > $HOME/.juliaw/src/$NAME.jl << EOF
module $NAME
end
EOF
    fi

    # Add PackageCompiler dependencies to temporary project
    julia --project=$HOME/.juliaw -e 'using Pkg; Pkg.add(["PackageCompiler", "TOML", "Logging"])'

    # Generate system image scripts
    cat > $HOME/.juliaw/sysimage.jl << EOF
using PackageCompiler
using TOML
using Logging

Logging.disable_logging(Logging.Info)
mkpath("$PWD/build")

println("juliaw: generating precompilation statements...")
run(\`julia --project="$PWD" --trace-compile="$PWD"/build/precompile.jl \$(ARGS)\`)

println("juliaw: finding dependencies...")
project = TOML.parsefile("Project.toml")
manifest = TOML.parsefile("Manifest.toml")
deps = Symbol[]
for dep in keys(project["deps"])
    if dep in keys(manifest)
	# Up to Julia 1.6
        dep_entry = manifest[dep][1]
    else
        # Julia 1.7+
        dep_entry = manifest["deps"][dep][1]
    end
    if "path" in keys(dep_entry)
        println("  - \$(dep) [skip]")
    else
        println("  - \$(dep)")
        push!(deps, Symbol(dep))
    end
end

println("juliaw: building system image...")
create_sysimage(
    deps,
    precompile_statements_file = "$PWD/build/precompile.jl",
    sysimage_path = "$PWD/build/sysimage.so",
)
EOF
    julia --project=$HOME/.juliaw $HOME/.juliaw/sysimage.jl $* 
else
    julia --project=. --sysimage build/sysimage.so $*
fi
