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

repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$repo_root"

staged_files=()
while IFS= read -r file; do
  staged_files+=("$file")
done < <(git diff --cached --name-only --diff-filter=ACMR)

if [[ "${#staged_files[@]}" -eq 0 ]]; then
  exit 0
fi

should_run_taplo=0
should_run_rust_suite=0

for file in "${staged_files[@]}"; do
  case "$file" in
    Cargo.toml|.taplo.toml|config/*.toml|crates/*/Cargo.toml)
      should_run_taplo=1
      should_run_rust_suite=1
      break
      ;;
    crates/*.rs|rustfmt.toml|build-tools/*.sh|build-tools/pre-commit|.github/workflows/*.yml)
      should_run_rust_suite=1
      ;;
  esac
done

if [[ "$should_run_taplo" -eq 1 ]]; then
  echo "[pre-commit] running TOML format check"
  ./build-tools/taplofmt.sh --check
fi

if [[ "$should_run_rust_suite" -eq 1 ]]; then
  echo "[pre-commit] running Rust format check"
  ./build-tools/rustfmt.sh --check

  echo "[pre-commit] running cargo check"
  ./build-tools/rustcheck.sh check

  echo "[pre-commit] running clippy"
  ./build-tools/rustcheck.sh clippy

  echo "[pre-commit] running test compile"
  ./build-tools/rustcheck.sh test-compile
fi
