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

# ── Resolve tools ────────────────────────────────────────────
BUN=$(command -v bun 2>/dev/null || echo "")
TSC=$(command -v tsc 2>/dev/null || echo "")

if [[ -z "$BUN" && -z "$TSC" ]]; then
  echo "pre-commit: neither bun nor tsc found, skipping checks"
  exit 0
fi

# Only check staged .ts/.tsx files (ignore deleted)
STAGED=$(git diff --cached --name-only --diff-filter=d -- '*.ts' '*.tsx')
if [[ -z "$STAGED" ]]; then
  exit 0
fi

echo "pre-commit: running checks..."

# ── 1. TypeScript typecheck ──────────────────────────────────
echo "  typecheck..."
if [[ -n "$BUN" ]]; then
  $BUN x tsc --noEmit
elif [[ -n "$TSC" ]]; then
  $TSC --noEmit
fi

# ── 2. Lint (Biome) ──────────────────────────────────────────
if [[ -n "$BUN" ]]; then
  echo "  lint..."
  $BUN run lint
fi

# ── 3. Unit tests for changed files ─────────────────────────
if [[ -n "$BUN" ]]; then
  # Find test files that correspond to changed source files
  TEST_FILES=""
  for f in $STAGED; do
    # If it's already a test file, include it
    if [[ "$f" == *.test.ts ]]; then
      TEST_FILES="$TEST_FILES $f"
      continue
    fi
    # Check if a matching test file exists
    test_file="${f%.ts}.test.ts"
    test_file_tsx="${f%.tsx}.test.ts"
    if [[ -f "$test_file" ]]; then
      TEST_FILES="$TEST_FILES $test_file"
    elif [[ -f "$test_file_tsx" ]]; then
      TEST_FILES="$TEST_FILES $test_file_tsx"
    fi
  done

  # Filter out integration tests that require a database
  UNIT_TEST_FILES=""
  for tf in $TEST_FILES; do
    if grep -q 'initDb\|DATABASE_URL' "$tf" 2>/dev/null; then
      echo "  skipping integration test: $tf"
    else
      UNIT_TEST_FILES="$UNIT_TEST_FILES $tf"
    fi
  done

  if [[ -n "$UNIT_TEST_FILES" ]]; then
    echo "  tests..."
    $BUN test --timeout 30000 $UNIT_TEST_FILES
  fi
fi

echo "pre-commit: all checks passed"
