#!/usr/bin/env bash
set -euo pipefail

# ─── Validate arguments ───────────────────────────────────────────────────────
if [[ $# -lt 1 ]]; then
    echo "Usage: $(basename "$0") [force|missing] [Release|RelWithDebInfo|Debug]"
    echo "  force   - Rebuild all packages from source"
    echo "  missing - Only build packages not already cached"
    echo "  build_type (optional) - One of: Release, RelWithDebInfo, Debug"
    echo "                          If omitted, all build types are processed"
    exit 1
fi

case "${1:-}" in
    force)   build_option="--build=*" ;;
    missing) build_option="--build=missing" ;;
    *)
        echo "Usage: $(basename "$0") [force|missing] [Release|RelWithDebInfo|Debug]"
        echo "  force   - Rebuild all packages from source"
        echo "  missing - Only build packages not already cached"
        exit 1
        ;;
esac

# ─── Validate optional build_type argument ────────────────────────────────────
all_build_types=(Release RelWithDebInfo Debug)

if [[ -n "${2:-}" ]]; then
    case "${2}" in
        Release|RelWithDebInfo|Debug)
            build_types=("${2}")
            ;;
        *)
            echo "ERROR: Invalid build type '${2}'. Must be one of: Release, RelWithDebInfo, Debug"
            exit 1
            ;;
    esac
else
    build_types=("${all_build_types[@]}")
fi

# ─── Register remote (skip if already registered) ─────────────────────────────
if conan remote list 2>/dev/null | grep -qi "bigfootpackages"; then
    echo "Conan remote 'bigfootpackages' already registered, skipping."
else
    echo "Adding Conan remote: bigfootpackages"
    if ! conan remote add bigfootpackages https://conan.romainboullard.com/artifactory/api/conan/BigfootPackages; then
        echo "ERROR: Failed to add Conan remote."
        exit 1
    fi
fi

# ─── Shared flags ─────────────────────────────────────────────────────────────
conan_common=(
    --remote=bigfootpackages
    -pr:h=./ConanProfiles/clang
    -pr:b=./ConanProfiles/Tools/clang
    -of build-linux
    -o "bigfoot/*:build_tests=True"
    -o "bigfoot/*:build_benchmarks=True"
    -o "bigfoot/*:tracy=True"
    -o "bigfoot/*:vulkan=True"
)

# ─── Install dependencies for each build type ─────────────────────────────────
for build_type in "${build_types[@]}"; do
    echo
    echo "[${build_type}] Installing dependencies..."
    if ! conan install . "${conan_common[@]}" ${build_option} -s:h "build_type=${build_type}"; then
        echo "ERROR: conan install failed for build type ${build_type}"
        exit 1
    fi
    echo "[${build_type}] Done."
done

echo
echo "All build types installed successfully."

# ─── Configure CMake for each build type ─────────────────────────────────────
echo
echo "Configuring CMake for each build type..."

for build_type in "${build_types[@]}"; do
    echo
    echo "[${build_type}] Activating build environment..."
    # shellcheck disable=SC1090
    source "build-linux/build/${build_type}/generators/conanbuild.sh"

    mkdir -p "graphviz-linux/${build_type}"

    echo "[${build_type}] Running CMake..."
    if ! cmake -S . -B "build-linux/${build_type}" \
        --toolchain "build-linux/build/${build_type}/generators/conan_toolchain.cmake" \
        -DCMAKE_BUILD_TYPE="${build_type}" \
        -G "Ninja" \
        --graphviz="graphviz-linux/${build_type}/graph.dot"; then
        echo "ERROR: CMake configuration failed for build type ${build_type}."
        exit 1
    fi
    echo "[${build_type}] Done."
done

echo
echo "CMake configuration successful."