#!/bin/sh
set -u

# shellcheck disable=SC2155
readonly LILY_SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)"
readonly LILY_SRC_DIR="${LILY_SRC_DIR:-$LILY_SCRIPT_DIR/src}"
readonly LILY_TEST_DIR="${LILY_TEST_DIR:-$LILY_SCRIPT_DIR/test}"
readonly LILY_BUILD_DIR="${LILY_BUILD_DIR:-$LILY_SCRIPT_DIR/out}"

readonly HBLANG_GIT="https://git.ablecorp.us/mlokis/hblang"
readonly HBLANG_COMMIT="fcbcaac67dd47887fef81bc62d4b66a6cf071f8c"
readonly HBLANG_BRANCH="main"
readonly HBLANG_CFLAGS="--path-projection lily $LILY_SRC_DIR/lib.hb ${HBLANG_CFLAGS:-}"

die() { error "$2" && exit "$1"; }
error() { printf "\033[31mERROR\033[0m: %s\n" "$1" 1>&2; }
log() { printf "\033[32mINFO\033[0m: %s\n" "$1"; }
warn() { printf "\033[33mWARN\033[0m: %s\n" "$1"; }

fetch_step() {

    command -v zig >/dev/null 2>&1 || die 101 "'zig' binary not found in PATH"
    command -v git >/dev/null 2>&1 || die 101 "'git' binary not found in PATH"

    if [ -d "$LILY_BUILD_DIR/hblang" ]; then
        cd "$LILY_BUILD_DIR/hblang" || die 1 "cd to $LILY_BUILD_DIR/hblang failed"

        CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD >/dev/null 2>&1)
        [ "$CURR_BRANCH" = "$HBLANG_BRANCH" ] || git checkout "$HBLANG_BRANCH" >/dev/null 2>&1
        CURR_COMMIT=$(git rev-parse HEAD >/dev/null 2>&1)
        [ "$CURR_COMMIT" = "$HBLANG_COMMIT" ] || git checkout "$HBLANG_COMMIT" >/dev/null 2>&1
    else
        mkdir -p "$LILY_BUILD_DIR/hblang"
        git clone "$HBLANG_GIT" "$LILY_BUILD_DIR/hblang" --branch "$HBLANG_BRANCH"
        cd "$LILY_BUILD_DIR/hblang" || die 1 "cd to $LILY_BUILD_DIR/hblang failed"
        git checkout "$HBLANG_COMMIT" >/dev/null 2>&1
    fi

    zig build install

    PATH="$LILY_BUILD_DIR/hblang/zig-out/bin:$PATH"

    cd "$LILY_SCRIPT_DIR" || die 1 "cd to $LILY_SCRIPT_DIR failed"

}

main() {
    mkdir -p "$LILY_BUILD_DIR" || die 1 "can't create build dir"
    fetch_step

    inp="${1:-main.hb}"

    [ -z "$inp" ] || [ ! -e "$inp" ] && die 1 "source file '$inp' does not exist"

    # shellcheck disable=SC2086
    {
        hblang $HBLANG_CFLAGS $inp
        # todo: dont do this second compile if first fails
        hblang $HBLANG_CFLAGS $inp --fmt >/dev/null 2>&1
    }
}

main "$@"