@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

openfiles >nul 2>&1
if !errorlevel! neq 0 (
	powershell -NoProfile -Command ^
	"Write-Host '============================================================' -ForegroundColor DarkRed;" ^
	"Write-Host '[エラー] このバッチファイルは 管理者として実行 が必要です。' -ForegroundColor DarkRed;" ^
	"Write-Host '============================================================' -ForegroundColor DarkRed;"
    pause
    exit /b
)

powershell -NoProfile -Command ^
	"Write-Host '========================================================';" ^
	"Write-Host 'jpegli 自動ビルドアップデートスクリプト';" ^
	"Write-Host '========================================================';"

:: ---------------------------------------------------------
:: 0. 変数設定
:: ---------------------------------------------------------
:: gimpのインストールフォルダにコピー
set "PLUGIN_PATH="
set "PLUGIN_PATH1="
set "SEARCH_EXE_PATH=gimp-2*"
set "SEARCH_EXE_PATH1=gimp-3*"
set "ADD_PATH=lib\gimp\2.0\plug-ins"
set "ADD_PATH1=lib\gimp\3.0\plug-ins"
set "COPY_PLUGIN_FOLDER=export-jpegli"
set "EXE=cjpegli.exe"

:: ---------------------------------------------------------
:: 0. 実行確認
:: ---------------------------------------------------------

powershell -NoProfile -Command ^
	"Write-Host 'インストールを開始しますか？ (Y/N): ' -ForegroundColor DarkYellow -NoNewline;" ^
	"$a = Read-Host;" ^
	"if ($a -eq 'y' -or $a -eq 'Y') { exit 1 } else { exit 0 }"

if errorlevel 1 (
    goto :EXECUTE
) else (
    goto :CANCEL
)

:CANCEL

powershell -NoProfile -Command ^
	"Write-Host '処理を中止しました。' -ForegroundColor DarkRed;" 
pause
exit /b

:EXECUTE

powershell -NoProfile -Command ^
	"Write-Host 'ビルドファイルを削除しますか？ (Y/N): ' -ForegroundColor DarkYellow -NoNewline;" ^
	"$a = Read-Host;" ^
	"if ($a.ToLower() -eq 'y') { exit 1 } else { exit 0 }"

if errorlevel 1 (
    set "built_file=0"
) else (
    set "built_file=1"
)

:: ---------------------------------------------------------
:: 1. 必須ツールのチェックとインストール
:: ---------------------------------------------------------
powershell -NoProfile -Command ^
	"Write-Host '';" ^
	"Write-Host '[1/5] 必要なビルドツールの状態を確認中...' -ForegroundColor DarkYellow;" 

:: Git のチェック
where git >nul 2>&1
if !errorlevel! neq 0 if not exist "C:\Program Files\Git\cmd\git.exe" (
	powershell -NoProfile -Command ^
		"Write-Host '- Git が見つかりません。インストールを開始します...' -ForegroundColor DarkYellow;" 
	winget install --id Git.Git -e --source winget --accept-source-agreements --accept-package-agreements --silent
	set "PATH=%PATH%;C:\Program Files\Git\cmd"
) else (
	powershell -NoProfile -Command ^
		"Write-Host '- Git: インストール済み (スキップします)' -ForegroundColor DarkYellow;" 
)

:: CMake のチェック
where cmake >nul 2>&1
if !errorlevel! neq 0 if not exist "C:\Program Files\CMake\bin\cmake.exe" (
	powershell -NoProfile -Command ^
		"Write-Host '- CMake が見つかりません。インストールを開始します...' -ForegroundColor DarkYellow;" 
	winget install --id Kitware.CMake -e --source winget --accept-source-agreements --accept-package-agreements --silent
	set "PATH=%PATH%;C:\Program Files\CMake\bin"
) else (
	powershell -NoProfile -Command ^
		"Write-Host '- CMake: インストール済み (スキップします)' -ForegroundColor DarkYellow;" 
)

:: Ninja のチェック
where ninja >nul 2>&1
if !errorlevel! neq 0 (
	powershell -NoProfile -Command ^
		"Write-Host '- Ninja が見つかりません。インストールを開始します...' -ForegroundColor DarkYellow;"
	winget install --id Ninja-build.Ninja -e --source winget --accept-source-agreements --accept-package-agreements --silent

	set "PATH=%PATH%;%LOCALAPPDATA%\Microsoft\WinGet\Links"

	where ninja >nul 2>&1
	if !errorlevel! neq 0 (
		powershell -NoProfile -Command ^
			"Write-Host '[エラー] Ninja のインストールまたは検出に失敗しました。' -ForegroundColor DarkRed;"
		pause
		exit /b
	)
) else (
	powershell -NoProfile -Command ^
		"Write-Host '- Ninja: インストール済み (スキップします)' -ForegroundColor DarkYellow;"
)

:: Visual Studio (MSVC) の汎用チェック
set "VS_ENV="
set "VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"

if exist "%VSWHERE%" (
    for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do (
        if exist "%%i\VC\Auxiliary\Build\vcvars64.bat" (
            set "VS_ENV=%%i\VC\Auxiliary\Build\vcvars64.bat"
        )
    )
)

if not defined VS_ENV (
	powershell -NoProfile -Command ^
		"Write-Host '- Visual Studio (C++ ビルドツール) が見つかりません。インストールを開始します...' -ForegroundColor DarkYellow;" ^
		"Write-Host '(※ 数GBのダウンロードが発生するため時間がかかります)' -ForegroundColor DarkYellow;" 
	start /wait winget install --id Microsoft.VisualStudio.Community -e --source winget --override "--add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --passive --norestart --wait" --accept-source-agreements --accept-package-agreements
    
    :: インストール後に再度パスを取得
    if exist "%VSWHERE%" (
        for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do (
            if exist "%%i\VC\Auxiliary\Build\vcvars64.bat" (
                set "VS_ENV=%%i\VC\Auxiliary\Build\vcvars64.bat"
            )
        )
    )
) else (
	powershell -NoProfile -Command ^
		"Write-Host '- Visual Studio (MSVC): インストール済み (スキップします)' -ForegroundColor DarkYellow;" 
)

:: 環境変数 PATH の補正
set "PATH=%PATH%;C:\Program Files\Git\cmd;C:\Program Files\CMake\bin"

:: ---------------------------------------------------------
:: 2. Visual Studio 環境変数の有効化
:: ---------------------------------------------------------
powershell -NoProfile -Command ^
	"Write-Host '';" ^
	"Write-Host '[2/5] ビルド環境を初期化中...' -ForegroundColor DarkYellow;" 

if not defined VS_ENV (
	powershell -NoProfile -Command ^
		"Write-Host '[エラー] Visual Studio C++ 環境の初期化スクリプトが見つかりませんでした。' -ForegroundColor DarkRed;"
	pause
	exit /b
)
call "%VS_ENV%" >nul

:: vcpkgのセットアップ
set "VCPKG_DIR=C:\vcpkg"
if not exist "%VCPKG_DIR%" (
	git clone https://github.com/microsoft/vcpkg.git "%VCPKG_DIR%"
	if errorlevel 1 (
		powershell -NoProfile -Command "Write-Host '[エラー] vcpkg の取得に失敗しました。' -ForegroundColor DarkRed;"
		pause
		exit /b
	)
	call "%VCPKG_DIR%\bootstrap-vcpkg.bat" -disableMetrics
	if errorlevel 1 (
		powershell -NoProfile -Command "Write-Host '[エラー] vcpkg のブートストラップに失敗しました。' -ForegroundColor DarkRed;"
		pause
		exit /b
	)
)

powershell -NoProfile -Command "Write-Host '必要なライブラリをインストール中...' -ForegroundColor DarkYellow;"
"%VCPKG_DIR%\vcpkg.exe" install giflib:x64-windows-static libjpeg-turbo:x64-windows-static openexr:x64-windows-static pkgconf:x64-windows-static
if errorlevel 1 (
	powershell -NoProfile -Command "Write-Host '[エラー] vcpkg でのライブラリインストールに失敗しました。' -ForegroundColor DarkRed;"
	pause
	exit /b
)

:: ---------------------------------------------------------
:: 3. ワークスペース作成と git clone
:: ---------------------------------------------------------
set "BUILD_DIR=%~dp0jpegli_workspace"

powershell -NoProfile -Command ^
	"Write-Host '[3/5] リポジトリを取得中: %BUILD_DIR%' -ForegroundColor DarkYellow;" 

if exist "%BUILD_DIR%" rd /s /q "%BUILD_DIR%"
mkdir "%BUILD_DIR%"
cd /d "%BUILD_DIR%"

git clone --recursive https://github.com/google/jpegli.git
if errorlevel 1 (
	powershell -NoProfile -Command ^
		"Write-Host '[エラー] Git clone に失敗しました。ネットワーク接続を確認してください。' -ForegroundColor DarkRed;"
    pause
    exit /b
)

cd jpegli

:: ---------------------------------------------------------
:: 4. CMake による構成設定 
:: ---------------------------------------------------------
powershell -NoProfile -Command ^
	"Write-Host '';" ^
	"Write-Host '[4/5] CMake 構成を生成中...' -ForegroundColor DarkYellow;" 

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release ^
  -DCMAKE_TOOLCHAIN_FILE="%VCPKG_DIR%\scripts\buildsystems\vcpkg.cmake" ^
  -DVCPKG_TARGET_TRIPLET=x64-windows-static ^
  -DBUILD_TESTING=OFF ^
  -DJPEGLI_STATIC=ON ^
  -DJPEGLI_BUNDLE_LIBPNG=ON ^
  -DJPEGLI_ENABLE_OPENEXR=ON ^
  -DJPEGLI_ENABLE_SJPEG=ON ^
  -DJPEGLI_ENABLE_BENCHMARK=OFF ^
  -DJPEGLI_ENABLE_DOXYGEN=OFF ^
  -DJPEGLI_ENABLE_MANPAGES=OFF ^
  -DJPEGLI_ENABLE_JPEGLI_LIBJPEG=ON ^
  -DJPEGLI_ENABLE_JNI=OFF

if errorlevel 1 (
	powershell -NoProfile -Command ^
		"Write-Host '[エラー] CMake に失敗しました。' -ForegroundColor DarkRed;"
	pause
	exit /b
)
cd build

:: ---------------------------------------------------------
:: 5. コンパイル実行
:: ---------------------------------------------------------
powershell -NoProfile -Command ^
	"Write-Host '[5/5] jpegli をビルド中...' -ForegroundColor DarkYellow;"  ^
	"Write-Host '--------------------------------------------------------' -ForegroundColor DarkYellow;" 

cmake --build . --config Release
if errorlevel 1 (
	powershell -NoProfile -Command ^
		"Write-Host '[エラー] ビルドに失敗しました。' -ForegroundColor DarkRed;"
    pause
    exit /b
)
powershell -NoProfile -Command ^
	"Write-Host '--------------------------------------------------------' -ForegroundColor DarkYellow;" 

:: ---------------------------------------------------------
:: 6. 成果物の抽出とクリーンアップ
:: ---------------------------------------------------------
powershell -NoProfile -Command ^
	"Write-Host '[6/6] %EXE% を抽出中...' -ForegroundColor DarkYellow;" ^
	"Write-Host '';"

set "TARGET_EXE="

:: cjpegli.exe のみを探す
for %%F in (
    "%BUILD_DIR%\jpegli\build\tools\%EXE%"
    "%BUILD_DIR%\jpegli\build\tools\Release\%EXE%"
    "%BUILD_DIR%\jpegli\build\Release\%EXE%"
    "%BUILD_DIR%\jpegli\build\%EXE%"
) do (
    if exist "%%~F" if not defined TARGET_EXE set "TARGET_EXE=%%~F"
)

if not defined TARGET_EXE (
	powershell -NoProfile -Command ^
		"Write-Host '[エラー] %EXE% が見つかりませんでした。' -ForegroundColor DarkRed;"
    pause
    exit /b
)

powershell -NoProfile -Command ^
	"Write-Host 'GIMPプラグインフォルダを検索中...' -ForegroundColor DarkYellow;" ^
	"Write-Host '';"

:: PowerShell を実行して結果を取得 (gimp2)
for /f "delims=" %%I in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "$exe='%SEARCH_EXE_PATH%'; $add='%ADD_PATH%'; $plugin='%COPY_PLUGIN_FOLDER%'; $t=@('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*','HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',\"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\$exe\"); $i=Get-ItemProperty $t -ErrorAction SilentlyContinue | Where-Object { $d = if ($_.Path) { $_.Path } else { $_.InstallLocation }; if ($d -and (Test-Path (Join-Path $d \"bin\$exe\"))) { $true } else { $false } } | Sort-Object -Property @{ Expression = { (Get-Item $_.PSPath).LastWriteTime } } -Descending | Select-Object -First 1; if ($i) { $r = if ($i.Path) { $i.Path } else { $i.InstallLocation }; Write-Output (Join-Path $r.TrimEnd('\') \"$add\$plugin\") }" 2^>^&1') do (
    set "PLUGIN_PATH=%%I"
)

:: PowerShell を実行して GIMP 3 のパスを取得 (gimp3)
for /f "delims=" %%I in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "$exe='%SEARCH_EXE_PATH1%'; $add='%ADD_PATH1%'; $plugin='%COPY_PLUGIN_FOLDER%'; $t=@('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*','HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',\"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\$exe\"); $i=Get-ItemProperty $t -ErrorAction SilentlyContinue | Where-Object { $d = if ($_.Path) { $_.Path } else { $_.InstallLocation }; if ($d -and (Test-Path (Join-Path $d \"bin\$exe\"))) { $true } else { $false } } | Sort-Object -Property @{ Expression = { (Get-Item $_.PSPath).LastWriteTime } } -Descending | Select-Object -First 1; if ($i) { $r = if ($i.Path) { $i.Path } else { $i.InstallLocation }; Write-Output (Join-Path $r.TrimEnd('\') \"$add\$plugin\") }" 2^>^&1') do (
    set "PLUGIN_PATH1=%%I"
)

:: 結果判定とコピー処理
:: =========================================================
:: GIMP 2 へのコピー処理
:: =========================================================
if defined PLUGIN_PATH (
    if exist "!PLUGIN_PATH!\.." (
        mkdir "!PLUGIN_PATH!" 2>nul

        powershell -NoProfile -Command ^
            "Write-Host '========================================================' -ForegroundColor DarkGreen;" ^
            "Write-Host ' [成功] GIMP2プラグインパスを取得しました:' -ForegroundColor DarkGreen;" ^
            "Write-Host ' !PLUGIN_PATH!' -ForegroundColor DarkYellow;" ^
            "Write-Host '========================================================' -ForegroundColor DarkGreen;" ^
			"Write-Host '';"

        powershell -NoProfile -Command ^
			"Write-Host '%EXE% を GIMP2プラグインフォルダにコピー中...' -ForegroundColor DarkYellow;" ^
			"Write-Host '';"
        
        copy /Y "!TARGET_EXE!" "!PLUGIN_PATH!\" > nul

        if !errorlevel! equ 0 (
            powershell -NoProfile -Command ^
                "Write-Host '--------------------------------------------------------' -ForegroundColor DarkCyan;" ^
                "Write-Host ' [完了] GIMP2プラグインへのコピーが成功しました！' -ForegroundColor DarkCyan;" ^
                "Write-Host '--------------------------------------------------------' -ForegroundColor DarkCyan;" ^
				"Write-Host '';"
        ) else (
            powershell -NoProfile -Command ^
				"Write-Host '[エラー] GIMP2へのコピー処理に失敗しました。' -ForegroundColor DarkRed;"
        )
    )
)

:: =========================================================
:: GIMP 3 へのコピー処理（※ GIMP 2 のブロック外に独立して配置）
:: =========================================================
if defined PLUGIN_PATH1 (
    if exist "!PLUGIN_PATH1!\.." (
        mkdir "!PLUGIN_PATH1!" 2>nul

        powershell -NoProfile -Command ^
            "Write-Host '========================================================' -ForegroundColor DarkGreen;" ^
            "Write-Host ' [成功] GIMP3プラグインパスを取得しました:' -ForegroundColor DarkGreen;" ^
            "Write-Host ' !PLUGIN_PATH1!' -ForegroundColor DarkYellow;" ^
            "Write-Host '========================================================' -ForegroundColor DarkGreen;" ^
			"Write-Host '';"

        powershell -NoProfile -Command ^
			"Write-Host '%EXE% を GIMP3プラグインフォルダにコピー中...' -ForegroundColor DarkYellow;" ^
			"Write-Host '';"

        copy /Y "!TARGET_EXE!" "!PLUGIN_PATH1!\" > nul

        if !errorlevel! equ 0 (
            powershell -NoProfile -Command ^
                "Write-Host '--------------------------------------------------------' -ForegroundColor DarkCyan;" ^
                "Write-Host ' [完了] GIMP3プラグインへのコピーが成功しました！' -ForegroundColor DarkCyan;" ^
                "Write-Host '--------------------------------------------------------' -ForegroundColor DarkCyan;" ^
				"Write-Host '';"
        ) else (
            powershell -NoProfile -Command ^
				"Write-Host '[エラー] GIMP3へのコピー処理に失敗しました。' -ForegroundColor DarkRed;" ^
				"Write-Host '';"
        )
    )
)

:: 元の作業フォルダから移動して作業ディレクトリを削除（選択結果に基づく）
cd /d "%~dp0"
if "%built_file%"=="0" (
	powershell -NoProfile -Command ^
		"Write-Host 'ビルド作業フォルダを削除中...' -ForegroundColor DarkYellow;" ^
		"Write-Host '';"
    rd /s /q "%BUILD_DIR%"
) else (
	powershell -NoProfile -Command ^
		"Write-Host 'ビルド作業フォルダを保持します: %BUILD_DIR%' -ForegroundColor DarkYellow;" ^
		"Write-Host '';"
)

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "Write-Host '========================================================' -ForegroundColor DarkCyan;" ^
    "Write-Host '  ビルド完了' -ForegroundColor DarkGreen;" ^
    "Write-Host '  実行ファイル出力先: %~dp0%EXE%' -ForegroundColor DarkGreen;" ^
    "Write-Host '========================================================' -ForegroundColor DarkCyan;"
	
pause