@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM =========================
REM Variables
REM =========================
SET FMT=clang-format
SET MODE=
SET EXIT_CODE=0

REM =========================
REM Parse arguments
REM =========================
:parse_args
IF "%~1"=="" GOTO end_parse_args
IF "%~1"=="--check" (
    SET MODE=check
) ELSE IF "%~1"=="--fix" (
    SET MODE=fix
) ELSE (
    REM Accumulate directories
    SET DIRS=!DIRS! "%~1"
)
SHIFT
GOTO parse_args
:end_parse_args

IF "%MODE%"=="" (
    ECHO Usage: %~nx0 --check|--fix <directory> [<directory> ...]
    EXIT /B 1
)

IF "%DIRS%"=="" (
    ECHO Please provide at least one directory.
    EXIT /B 1
)

REM =========================
REM Iterate over directories
REM =========================
FOR %%D IN (%DIRS%) DO (
    IF NOT EXIST "%%~D" (
        ECHO %%~D is not a valid directory.
        SET EXIT_CODE=1
        GOTO :continue_dirs
    )

    REM Recursively find source files
    FOR /R "%%~D" %%F IN (*.h *.hpp *.c *.cpp *.m *.mm) DO (
        SET FILE=%%F
        REM Skip *_generated* files
        ECHO !FILE! | FINDSTR /I "_generated" >nul
        IF ERRORLEVEL 1 (
            IF "%MODE%"=="fix" (
                ECHO Formatting !FILE!
                %FMT% -i "!FILE!"
            ) ELSE (
                ECHO Checking !FILE!
                %FMT% --dry-run --Werror "!FILE!" 2>nul
                IF ERRORLEVEL 1 (
                    REM clang-format will already print diagnostics
                    SET EXIT_CODE=1
                )
            )
        )
    )

    :continue_dirs
)

EXIT /B %EXIT_CODE%
