@echo off
cd /d "%~dp0"
setlocal enabledelayedexpansion

echo.
echo =========================================
echo    リモート用ソフト 自動インストーラー
echo =========================================
echo.

:: where findstr でエラーが出た場合、 C:\WINDOWS\system32 を追加
:: 0 = PATH正常 / 1 = PATH不足
set PATHCHECK=0
where findstr >nul 2>nul
if %errorlevel% neq 0 (
    set "PATH=%PATH%;C:\WINDOWS\system32"
    set PATHCHECK=1
)

NET SESSION > NUL 2>&1
if NOT %ERRORLEVEL% EQU 0 goto NotAdmin 
echo 管理者権限で実行中
echo.
goto Start

:NotAdmin 
color e0
echo ERROR: 一般権限で実行中
echo 管理者権限で実行してください。
echo 何かキーを押すと、何も変更せずに終了します。
pause > nul
exit

:Start
:: OS バージョンチェック（Windows 7 以降: 6 以上）
for /f "tokens=4 delims=[.] " %%v in ('ver') do set VERMAJOR=%%v
if %VERMAJOR% LSS 6 (
    color e0
    echo Windows 7 以降でのみ実行可能です。
    echo 何かキーを押すと、何も変更せずに終了します。
    pause > nul
    exit /b
)

where powershell >nul 2>nul
if %errorlevel% neq 0 (
    set "PATH=%PATH%;C:\Windows\System32\WindowsPowerShell\v1.0"
)

::=======================================================
:: REMOTE_TOOL_SELECTION をコピー
::=======================================================
echo REMOTE_TOOL_SELECTION をコピーしています...
taskkill /IM REMOTE_TOOL_SELECTION.exe /F >nul 2>&1
if exist "REMOTE_TOOL_SELECTION" (
    xcopy "REMOTE_TOOL_SELECTION" "C:\RF_soft\RF_staff\REMOTE_TOOL_SELECTION" /E /I /H /Y >nul
    powershell -Command "Get-ChildItem 'C:\RF_soft\RF_staff\REMOTE_TOOL_SELECTION' -Recurse | Unblock-File" >nul 2>&1
) else (
    echo   コピー元 REMOTE_TOOL_SELECTION が存在しません。
)

::=======================================================
:: SplashtopSOS.exe をコピー
::=======================================================
set "SPLA_SRC=インストーラー\SplashtopSOS.exe"
set "SPLA_DST=C:\RF_soft\Splashtop\SplashtopSOS.exe"

echo.
if exist "%SPLA_SRC%" (
    echo SplashtopSOS をコピーしています...
    if not exist "C:\RF_soft\Splashtop" (
        mkdir "C:\RF_soft\Splashtop"
    )

    copy /Y "%SPLA_SRC%" "%SPLA_DST%" >nul
    copy /Y "%SPLA_SRC%" "%USERPROFILE%\Desktop\SplashtopSOS.exe" >nul
    powershell -NoProfile -ExecutionPolicy Bypass -Command "Unblock-File -Path '%SPLA_DST%'" >nul 2>&1
    powershell -NoProfile -ExecutionPolicy Bypass -Command "Unblock-File -Path '%USERPROFILE%\Desktop\SplashtopSOS.exe'" >nul 2>&1
    if exist "%USERPROFILE%\OneDrive\Desktop" (
        copy /Y "%SPLA_SRC%" "%USERPROFILE%\OneDrive\Desktop\SplashtopSOS.exe" >nul
        powershell -NoProfile -ExecutionPolicy Bypass -Command "Unblock-File -Path '%USERPROFILE%\OneDrive\Desktop\SplashtopSOS.exe'" >nul 2>&1
    )
) else (
    echo SplashtopSOS.exe が見つかりません:
    echo %SPLA_SRC%
)

::=======================================================
:: UltraVNC をインストール
::=======================================================
echo.
if defined PROCESSOR_ARCHITEW6432 (
    set ARCH=AMD64
) else (
    set ARCH=%PROCESSOR_ARCHITECTURE%
)
:: echo 検出されたアーキテクチャ: %ARCH%

::=========================================
:: インストール先フォルダ
::=========================================
set UDIR=C:\Program Files\uvnc bvba\UltraVNC

::=========================================
:: UltraVNC 既存インストール確認
::=========================================
if exist "%UDIR%\winvnc.exe" (
    if exist "%UDIR%\vncviewer.exe" (
        echo -----------------------------------------
        echo UltraVNC はすでにインストールされています。
        echo インストール処理をスキップします。
        echo -----------------------------------------
        echo.
        goto NDS_CHANGE_INI
    )
)

::===============================
:: インストーラーのパス設定
::===============================
if /i "%ARCH%"=="x86" (
    set "SETUPEXE=インストーラー\UltraVNC_1_2_24_X86_Setup.exe"
    set "LANGEXE=日本語化バッチ\ultravnc1224_x86_jp.exe"
    set "INI=設定ファイル\x86_ini\ultravnc.ini"
) else if /i "%ARCH%"=="AMD64" (
    set "SETUPEXE=インストーラー\UltraVNC_1_2_24_X64_Setup.exe"
    set "LANGEXE=日本語化バッチ\ultravnc1224_x64_jp.exe"
    set "INI=設定ファイル\x64_ini\ultravnc.ini"
) else (
    echo 対応していないアーキテクチャのため終了します。
    goto EXIT
)
set "OPTIONS=設定ファイル\options.vnc"

::===============================
:: ファイル存在チェック
::===============================
if not exist "%SETUPEXE%" (
    echo インストーラーファイルが見つかりません: 
    echo %SETUPEXE%
    goto EXIT
)

if not exist "%LANGEXE%" (
    echo 日本語化パッチが見つかりません:
    echo %LANGEXE%
    goto EXIT
)

if not exist "%INI%" (
    echo INI 設定ファイルが見つかりません:
    echo %INI%
    goto EXIT
)

if not exist "%OPTIONS%" (
    echo 設定ファイルが見つかりません:
    echo %OPTIONS%
    goto EXIT
)

::===============================
:: UltraVNC 既存サービス停止
::===============================
sc query uvnc_service | find "RUNNING" >nul
if %errorlevel%==0 (
    echo UltraVNC サービスを停止します...
    net stop uvnc_service >nul
)

::===============================
:: 既存 FW ルール削除
::===============================
:: echo 既存ファイアウォールルールを削除しています...
:: netsh advfirewall firewall delete rule name="vnc5800" >nul
:: netsh advfirewall firewall delete rule name="vnc5900" >nul
:: netsh advfirewall firewall delete rule name="winvnc.exe" >nul

::===============================
:: UltraVNC インストール
::===============================
echo UltraVNC をインストールしています...
"%SETUPEXE%" /SP- /VERYSILENT /LOADINF="設定ファイル\server_full_install_setting.inf" /NORESTART

if not exist "%UDIR%\winvnc.exe" (
    echo UltraVNC のインストールに失敗しました。
    goto EXIT
)

:: ----------------------------------------------------------
:: UltraVNC 不要ショートカット削除
:: ----------------------------------------------------------
echo UltraVNC の不要なショートカットを削除しています...
set "LINK1=%USERPROFILE%\Desktop\UltraVNC Repeater.lnk"
set "LINK2=%USERPROFILE%\Desktop\UltraVNC Launcher.lnk"

if exist "%LINK1%" (
    del /f "%LINK1%"
)
if exist "%LINK2%" (
    del /f "%LINK2%"
)

::===============================
:: 日本語化パッチの適用
::===============================
echo 日本語化パッチを適用しています...
echo ※「OK」を押すと次に進みます。
copy /Y "%LANGEXE%" "%UDIR%\ultravnc_jp.exe" >nul
"%UDIR%\ultravnc_jp.exe" >nul

::===============================
:: 設定ファイルの上書き
::===============================
echo 設定を反映しています...
if not exist "%USERPROFILE%\AppData\Roaming\UltraVNC" (
    mkdir "%USERPROFILE%\AppData\Roaming\UltraVNC"
)
copy /Y "%INI%" "%UDIR%\ultravnc.ini" >nul
copy /Y "%OPTIONS%" "%UDIR%\options.vnc" >nul
copy /Y "%OPTIONS%" "%USERPROFILE%\AppData\Roaming\UltraVNC\options.vnc" >nul
echo.

::===============================
:: ファイアウォールルール追加
::===============================
:: echo ファイアウォールルールを追加しています...

:: netsh advfirewall firewall add rule name="vnc5800" dir=in action=allow protocol=TCP localport=5800 profile=any >nul
:: netsh advfirewall firewall add rule name="vnc5900" dir=in action=allow protocol=TCP localport=5900 profile=any >nul
:: netsh advfirewall firewall add rule name="winvnc.exe" dir=in action=allow program="%UDIR%\winvnc.exe" profile=any >nul

:: Ping の許可
:: netsh advfirewall firewall set rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv4 受信)" new enable=yes profile=any >nul
:: netsh advfirewall firewall set rule name="ファイルとプリンターの共有 (エコー要求 - ICMPv6 受信)" new enable=yes profile=any >nul


:NDS_CHANGE_INI
:: ----------------------------------------------------------
:: NDSのリモートソフトパスの変更
:: ----------------------------------------------------------
taskkill /IM NDS.exe /F >nul 2>&1

set "BACKUP_DIR=C:\RF_soft\RF_staff\BackupINI"
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

:: 最新の NDS.INI を取得
set "NDSINI="
set "LATEST_TIME="

for %%F in (
    "C:\Windows\NDS.INI"
    "%USERPROFILE%\AppData\Local\VirtualStore\Windows\NDS.INI"
    "%USERPROFILE%\AppData\Local\VirtualStore\Program Files (x86)\RF\NDS\NDS.INI"
    "%USERPROFILE%\AppData\Local\VirtualStore\Program Files\RF\NDS\NDS.INI"
    "C:\Program Files\RF\NDS\NDS.INI"
    "C:\Program Files (x86)\RF\NDS\NDS.INI"
) do (
    if exist "%%F" (
        set "CUR_TIME=%%~tF"
        if "!LATEST_TIME!"=="" (
            set "LATEST_TIME=!CUR_TIME!"
            set "NDSINI=%%F"
        ) else (
            if "!CUR_TIME!" GTR "!LATEST_TIME!" (
                set "LATEST_TIME=!CUR_TIME!"
                set "NDSINI=%%F"
            )
        )
    )
)

if "!NDSINI!"=="" (
    goto NEXT_CHANGE_INI
)

echo NDS.INIの場所: !NDSINI!
echo 更新日時: !LATEST_TIME!

:: --- バックアップ名を安全な形式に変換 ---
set "DT=!LATEST_TIME!"
set "DT=!DT::=-!"
set "DT=!DT:/=-!"
set "DT=!DT: =_!"

copy /Y "!NDSINI!" "%BACKUP_DIR%\NDS_!DT!.INI"

:: 編集用ファイル
set "TMPFILE=%BACKUP_DIR%\NDS_edit.ini"
set "OUTFILE=%BACKUP_DIR%\NDS_edit_out.ini"
copy /Y "!NDSINI!" "!TMPFILE!"

:: --- g_remote_tool_path の書き換え ---
if exist "!OUTFILE!" del /f /q "!OUTFILE!"

for /f "usebackq delims=" %%A in ("!TMPFILE!") do (
    set "line=%%A"
    echo !line! | findstr /i /c:"g_remote_tool_path=" >nul
    if !errorlevel! == 0 (
        >>"!OUTFILE!" echo g_remote_tool_path=C:\RF_soft\RF_staff\REMOTE_TOOL_SELECTION\REMOTE_TOOL_SELECTION.exe
    ) else (
        >>"!OUTFILE!" echo !line!
    )
)

:: 上書き
copy /Y "!OUTFILE!" "!NDSINI!"

del /f /q "!TMPFILE!" >nul 2>&1
del /f /q "!OUTFILE!" >nul 2>&1

echo.


:NEXT_CHANGE_INI
:: ----------------------------------------------------------
:: NEXTのリモートソフトパスの変更
:: ----------------------------------------------------------

:: NAOMI-NEXTフォルダのパス判定
if exist "C:\Program Files (x86)\RF\NAOMI_NEXT" (
    set "NEXT_PATH=C:\Program Files (x86)\RF\NAOMI_NEXT"
) else if exist "C:\Program Files\RF\NAOMI_NEXT" (
    set "NEXT_PATH=C:\Program Files\RF\NAOMI_NEXT"
) else (
    goto LAUNCHER
)

taskkill /IM NAOMI-NEXT.exe /F >nul 2>&1

set "BACKUP_DIR=C:\RF_soft\RF_staff\BackupINI"
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

:: 最新の NAOMI-NEXT.INI を取得
set "NEXTINI="
set "LATEST_TIME="

for %%F in (
    "C:\Windows\NAOMI-NEXT.INI"
    "%USERPROFILE%\AppData\Local\VirtualStore\Windows\NAOMI-NEXT.INI"
    "%USERPROFILE%\AppData\Local\VirtualStore\Program Files (x86)\RF\NAOMI_NEXT\NAOMI-NEXT.INI"
    "%USERPROFILE%\AppData\Local\VirtualStore\Program Files\RF\NAOMI_NEXT\NAOMI-NEXT.INI"
    "!NEXT_PATH!\NAOMI-NEXT.INI"
) do (
    if exist "%%F" (
        set "CUR_TIME=%%~tF"
        if "!LATEST_TIME!"=="" (
            set "LATEST_TIME=!CUR_TIME!"
            set "NEXTINI=%%F"
        ) else (
            if "!CUR_TIME!" GTR "!LATEST_TIME!" (
                set "LATEST_TIME=!CUR_TIME!"
                set "NEXTINI=%%F"
            )
        )
    )
)

if "!NEXTINI!"=="" (
    goto LAUNCHER
)

echo NAOMI-NEXT.INIの場所: !NEXTINI!
echo 更新日時: !LATEST_TIME!

:: ------ バックアップ作成 ------
set "DT=!LATEST_TIME!"
set "DT=!DT::=-!"
set "DT=!DT:/=-!"
set "DT=!DT: =_!"

copy /Y "!NEXTINI!" "%BACKUP_DIR%\NAOMI-NEXT_!DT!.INI"

:: 編集用ファイル
set "TMPFILE=%BACKUP_DIR%\NAOMI-NEXT_edit.ini"
set "OUTFILE=%BACKUP_DIR%\NAOMI-NEXT_edit_out.ini"
copy /Y "!NEXTINI!" "!TMPFILE!"

:: ------ g_remote_path_text の書き換え ------
if exist "!OUTFILE!" del /f /q "!OUTFILE!"

for /f "usebackq delims=" %%A in ("!TMPFILE!") do (
    set "line=%%A"
    echo !line! | findstr /i /c:"g_remote_path_text=" >nul
    if !errorlevel! == 0 (
        >>"!OUTFILE!" echo g_remote_path_text=C:\RF_soft\RF_staff\REMOTE_TOOL_SELECTION\REMOTE_TOOL_SELECTION.exe
    ) else (
        >>"!OUTFILE!" echo !line!
    )
)

:: ------ 上書き ------
copy /Y "!OUTFILE!" "!NEXTINI!"

del /f /q "!TMPFILE!" >nul 2>&1
del /f /q "!OUTFILE!" >nul 2>&1

echo.


:LAUNCHER
:: ----------------------------------------------------------
:: launcher.exe / launcher2.exe のタスク終了
:: ----------------------------------------------------------
if exist "C:\RFLauncher\Launcher\launcher.exe" (
    echo launcher.exe / launcher2.exe を終了しています...
    taskkill /IM launcher.exe /F >nul 2>&1
    taskkill /IM launcher2.exe /F >nul 2>&1
    timeout /t 3 /nobreak >nul
) else (
    goto AFTER_CONFIG_EDIT
)
echo.

:: ----------------------------------------------------------
:: 必要ファイルのコピー
:: ----------------------------------------------------------
xcopy "設定ファイル\ランチャーボタン素材" "C:\RF_soft\ランチャーボタン素材" /H /E /Y /I >nul
xcopy "インストーラー\忍者リモートインストーラー" "C:\RF_soft\RF_staff\忍者リモートインストーラー" /H /E /Y /I >nul

:: ----------------------------------------------------------
:: 忍者リモートのインストール
:: ----------------------------------------------------------
if not exist "C:\RF_soft\忍者リモート\忍者リモート.exe" (
    echo 忍者リモート をインストールしています...
    msiexec /i "C:\RF_soft\RF_staff\忍者リモートインストーラー\忍者リモートSetup.msi" /passive /norestart
) else (
    echo 忍者リモート は既にインストール済みです。スキップします。
)
echo.

:: ----------------------------------------------------------
:: rfApp2.config → rfApp.config の順に存在確認
:: ----------------------------------------------------------
set "CFG1=C:\RFLauncher\rfApp2.config"
set "CFG2=C:\RFLauncher\rfApp.config"

if exist "%CFG1%" (
    set "CFG=%CFG1%"
    set "CFG_TYPE=CFG1"
) else (
    if exist "%CFG2%" (
        set "CFG=%CFG2%"
        set "CFG_TYPE=CFG2"
    ) else (
        echo rfApp.config が存在しないため設定変更をスキップします。
        goto AFTER_CONFIG_EDIT
    )
)

echo 編集対象の config: %CFG%

:: ----------------------------------------------------------
:: config の書き換え処理
:: ----------------------------------------------------------
set "TEMP_TXT=設定ファイル\config_temp.txt"

:: 元の CFG をコピー
copy "%CFG%" "%TEMP_TXT%" >nul

if "%CFG_TYPE%"=="CFG1" (
    powershell -NoLogo -NoProfile -Command ^
    "$Path='%TEMP_TXT%';" ^
    "$xml=[xml](Get-Content -LiteralPath $Path -Encoding UTF8);" ^
    "$node = $xml.SelectSingleNode('//LauncherSettingAddImageButton');" ^
    "$node.SelectSingleNode('ButtonName2').InnerText='リモートツール';" ^
    "$node.SelectSingleNode('IsButton2').InnerText='true';" ^
    "$node.SelectSingleNode('ApplicationPath2').InnerText='C:\RF_soft\RF_staff\REMOTE_TOOL_SELECTION\REMOTE_TOOL_SELECTION.exe';" ^
    "$node.SelectSingleNode('ButtonImageAddress2').InnerText='C:\RF_soft\ランチャーボタン素材\app_remote.png';" ^
    "$settings = New-Object System.Xml.XmlWriterSettings;" ^
    "$settings.Indent = $true; $settings.Encoding = New-Object System.Text.UTF8Encoding($true);" ^
    "$writer = [System.Xml.XmlWriter]::Create($Path, $settings);" ^
    "$xml.Save($writer); $writer.Close();"
) else (
    powershell -NoLogo -NoProfile -Command ^
    "$Path='%TEMP_TXT%';" ^
    "$xml=[xml](Get-Content -LiteralPath $Path -Encoding UTF8);" ^
    "$node = $xml.SelectSingleNode('//CommonSettings');" ^
    "$node.SelectSingleNode('ButtonName2').InnerText='リモートツール';" ^
    "$node.SelectSingleNode('IsButton2').InnerText='true';" ^
    "$node.SelectSingleNode('ApplicationPath2').InnerText='C:\RF_soft\RF_staff\REMOTE_TOOL_SELECTION\REMOTE_TOOL_SELECTION.exe';" ^
    "$settings = New-Object System.Xml.XmlWriterSettings;" ^
    "$settings.Indent = $true; $settings.Encoding = New-Object System.Text.UTF8Encoding($true);" ^
    "$writer = [System.Xml.XmlWriter]::Create($Path, $settings);" ^
    "$xml.Save($writer); $writer.Close();"
)

:: バックアップ作成
set date2=%date:/=%
set time2=%time: =0%
set time3=%time2::=%
set v=%date2%_%time3:~0,6%
for %%F in ("%CFG%") do set "CFG_NAME=%%~nF"
for %%F in ("%CFG%") do set "CFG_EXT=%%~xF"
ren "%CFG%" "%CFG_NAME%_%v%%CFG_EXT%"

:: 上書きコピー
copy "%TEMP_TXT%" "%CFG%" >nul
if exist "%TEMP_TXT%" del "%TEMP_TXT%"

echo config 編集完了
echo.


:AFTER_CONFIG_EDIT
:: ----------------------------------------------------------
:: Launcher を再起動
:: ----------------------------------------------------------
if exist "C:\RFLauncher\Launcher\launcher.exe" (
    echo ランチャーを起動します...
    start "" "C:\RFLauncher\Launcher\launcher.exe"
    if "%PATHCHECK%"=="1" (
        call :ADD_PATH
    )
)

echo.
echo =========================================
echo        インストールが完了しました
echo =========================================
echo.

:EXIT
endlocal
echo.
echo 何かキーを押すか、右上の x をクリックしてウィンドウを閉じてください。
pause >nul
exit

:ADD_PATH
:: システム PATH への追加判定
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path | find /i "C:\Windows\System32" >nul
if errorlevel 1 (
    echo システム PATH に C:\Windows\System32 を追加します...
    for /f "tokens=2,*" %%A in ('
        reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path
    ') do set "SYS_PATH=%%B"
    rem 末尾の ; を除去
    if "!SYS_PATH:~-1!"==";" (
        set "SYS_PATH=!SYS_PATH:~0,-1!"
    )
    setx /M PATH "!SYS_PATH!;C:\Windows\System32" >nul
) else (
    echo C:\Windows\System32 は既に存在します。
)