#!/bin/bash
set -euo pipefail

FMT="clang-format"
MODE=""
DIRS=()
EXIT_CODE=0

# =========================
# Parse arguments
# =========================
for arg in "$@"; do
    case "$arg" in
        --check)
            MODE="check"
            ;;
        --fix)
            MODE="fix"
            ;;
        *)
            DIRS+=("$arg")
            ;;
    esac
done

# Ensure mode is set
if [[ -z "$MODE" ]]; then
    echo "Usage: $0 --check|--fix <directory> [<directory> ...]"
    exit 1
fi

# Ensure at least one directory
if [[ ${#DIRS[@]} -eq 0 ]]; then
    echo "Please provide at least one directory."
    exit 1
fi

# =========================
# Process directories
# =========================
for DIR in "${DIRS[@]}"; do
    if [[ ! -d "$DIR" ]]; then
        echo "$DIR is not a valid directory."
        EXIT_CODE=1
        continue
    fi

    # Find all source files safely (null-separated)
    while IFS= read -r -d '' FILE; do
        [[ "$FILE" == *_generated* ]] && continue

        if [[ "$MODE" == "fix" ]]; then
            echo "Formatting $FILE"
            "$FMT" -i "$FILE"
        else
            echo "Checking $FILE"
            # Check mode: clang-format diagnostic only
            if ! "$FMT" --dry-run --Werror "$FILE"; then
                # clang-format prints: file:line:col: error ...
                EXIT_CODE=1
            fi
        fi
    done < <(
        find "$DIR" \( -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.m' -o -name '*.mm' \) -print0
    )
done

exit $EXIT_CODE
