@echo off
setlocal enabledelayedexpansion

echo Starting Blender file compression...

REM Check if files were dragged onto the batch file
if "%~1"=="" (
    echo.
    echo Usage: Drag .blend files onto this batch file to compress them.
    echo Output will be saved to the \output folder.
    echo.
    pause
    exit /b 1
)

REM Create output directory if it doesn't exist
if not exist "output" mkdir "output"

REM Initialize counters and tracking
set "processed=0"
set "crashed=0"
set "skipped=0"
set "deleted_similar=0"
set "threshold_percent=10"

REM Create a temporary Python script for compression
set "TEMP_SCRIPT=compress_blend_temp.py"
echo Creating Python script: !TEMP_SCRIPT!

(
echo import bpy
echo import os
echo import sys
echo.
echo # Enable compression globally
echo bpy.context.preferences.filepaths.save_version = 0
echo bpy.context.preferences.filepaths.use_file_compression = True
echo.
echo # Create output directory if it doesn't exist
echo if not os.path.exists^("output"^):
echo     os.makedirs^("output"^)
echo.
echo # Get command line arguments ^(the dragged files^)
echo blend_files = sys.argv[sys.argv.index^("--"^) + 1:] if "--" in sys.argv else []
echo.
echo print^("Found " + str^(len^(blend_files^)^) + " .blend files to compress"^)
echo.
echo def is_compressed_file^(path^):
echo     try:
echo         with open^(path, 'rb'^) as f:
echo             header = f.read^(4^)
echo             if header[:2] == b'\x1f\x8b':  # gzip
echo                 return True
echo             if header == b'\x28\xb5\x2f\xfd':  # zstd
echo                 return True
echo         return False
echo     except Exception:
echo         return False
echo.
echo for blend_file in blend_files:
echo     if blend_file.lower^(^).endswith^(".blend"^):
echo         try:
echo             # Create output path in output folder
echo             filename = os.path.basename^(blend_file^)
echo             output_file = os.path.join^("output", filename^)
echo             # Check if output file already exists
echo             if os.path.exists^(output_file^):
echo                 print^("SKIP_EXISTING:" + blend_file^)
echo                 continue
echo             # Skip if source is already compressed
echo             if is_compressed_file^(blend_file^):
echo                 print^("SKIP_ALREADY_COMPRESSED:" + blend_file^)
echo                 continue
echo             print^("PROCESSING:" + blend_file^)
echo             # Load the blend file
echo             bpy.ops.wm.open_mainfile^(filepath=blend_file^)
echo             # Save with compression to output folder
echo             bpy.ops.wm.save_mainfile^(filepath=output_file, compress=True^)
echo             print^("SUCCESS:" + blend_file + ":" + output_file^)
echo         except Exception as e:
echo             print^("CRASH:" + blend_file + ":" + str^(e^)^)
echo     else:
echo         print^("SKIP_NOT_BLEND:" + blend_file^)
echo.
echo print^("COMPRESSION_COMPLETE"^)
echo bpy.ops.wm.quit_blender^(^)
) > "!TEMP_SCRIPT!"

REM Check if script was created successfully
if exist "!TEMP_SCRIPT!" (
    echo Script created successfully: !TEMP_SCRIPT!
) else (
    echo ERROR: Failed to create script file!
    pause
    exit /b 1
)

REM Run Blender to process the dragged files
echo Processing dragged .blend files...
echo Using script: !TEMP_SCRIPT!
del /f /q "blender_output.txt" 2>nul
blender --background --factory-startup --python "!TEMP_SCRIPT!" -- %* 2^>^&1 | powershell -NoProfile -Command "$input | Tee-Object -FilePath 'blender_output.txt'"

REM Clean up temporary script
echo Cleaning up temporary script...
del "!TEMP_SCRIPT!" 2>nul

REM Parse output and generate report
echo.
echo ========================================
echo COMPRESSION REPORT
echo ========================================
echo.

REM Count processed files and get file info
for /f "tokens=1,2,3 delims=:" %%a in (blender_output.txt) do (
    if "%%a"=="SUCCESS" (
        set /a processed+=1
        set "original_file=%%b"
        set "compressed_file=%%c"
        
        REM Get file sizes
        for %%f in ("!original_file!") do set "original_size=%%~zf"
        for %%f in ("!compressed_file!") do set "compressed_size=%%~zf"
        
        echo [!processed!] !original_file!
        echo     Original: !original_size! bytes
        echo     Compressed: !compressed_size! bytes
        set /a "savings=!original_size! - !compressed_size!"
        if !original_size! gtr 0 (set /a percent=(savings*100)/original_size) else (set percent=0)
        echo     Savings: !savings! bytes
        echo     Reduction: !percent!%%
        if !percent! lss !threshold_percent! (
            del "!compressed_file!" 2>nul
            set /a deleted_similar+=1
            echo     Deleted: too similar to original
        )
        echo.
    ) else if "%%a"=="CRASH" (
        set /a crashed+=1
        echo [!crashed!] CRASHED: %%b
        echo     Error: %%c
        echo.
    ) else if "%%a"=="SKIP_EXISTING" (
        set /a skipped+=1
        echo [!skipped!] SKIPPED ^(already exists^): %%b
        echo.
    ) else if "%%a"=="SKIP_NOT_BLEND" (
        set /a skipped+=1
        echo [!skipped!] SKIPPED ^(not .blend^): %%b
        echo.
    ) else if "%%a"=="SKIP_ALREADY_COMPRESSED" (
        set /a skipped+=1
        echo [!skipped!] SKIPPED ^(already compressed^): %%b
        echo.
    )
)

REM Clean up output file
del /f /q "blender_output.txt" 2>nul

echo ========================================
echo SUMMARY
echo ========================================
echo Processed: !processed! files
echo Crashed: !crashed! files
echo Skipped: !skipped! files
echo Deleted ^(too similar^): !deleted_similar! files
echo Total: %* files
echo ========================================
echo.
echo Done!
pause 