@echo off
chcp 65001 >nul 2>&1
setlocal EnableDelayedExpansion

:: ============================================================
:: LobsterAI Windows 编译与打包环境一键安装脚本
:: ============================================================
:: 使用方式：以管理员身份运行此脚本
:: 功能：自动安装所有编译和打包所需的环境依赖
:: ============================================================

title LobsterAI 环境安装程序

echo.
echo ============================================================
echo   LobsterAI Windows 编译与打包环境一键安装
echo ============================================================
echo.

:: -----------------------------------------------------------
:: 步骤 0: 检查管理员权限
:: -----------------------------------------------------------
echo [0/8] 检查管理员权限...
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo.
    echo [错误] 此脚本需要管理员权限运行！
    echo        请右键此文件，选择"以管理员身份运行"。
    echo.
    pause
    exit /b 1
)
echo       √ 已获取管理员权限
echo.

:: -----------------------------------------------------------
:: 步骤 1: 检查并安装 Node.js 24.x
:: -----------------------------------------------------------
echo [1/8] 检查 Node.js...

:: 先刷新 PATH 以便检测已安装但未在当前 session 中的程序
set "PATH=C:\Program Files\nodejs;%PATH%"

where node >nul 2>&1
if %errorlevel% equ 0 (
    for /f "tokens=*" %%v in ('node --version 2^>nul') do set NODE_VER=%%v
    echo !NODE_VER! | findstr /r "^v24\." >nul 2>&1
    if !errorlevel! equ 0 (
        echo       √ Node.js 已安装: !NODE_VER!
    ) else (
        echo       ! Node.js 已安装但版本不对: !NODE_VER!
        echo         需要 24.x 版本，正在安装...
        winget install OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements
        if !errorlevel! neq 0 (
            echo       [警告] winget 安装失败，请手动从 https://nodejs.org/ 下载 Node.js 24.x
        )
    )
) else (
    echo       Node.js 未安装，正在通过 winget 安装...
    winget install OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements
    if !errorlevel! neq 0 (
        echo       [警告] winget 安装失败，请手动从 https://nodejs.org/ 下载 Node.js 24.x
    )
)

:: 刷新 PATH
set "PATH=C:\Program Files\nodejs;%PATH%"
echo.

:: -----------------------------------------------------------
:: 步骤 2: 检查并安装 Git
:: -----------------------------------------------------------
echo [2/8] 检查 Git...

set "PATH=C:\Program Files\Git\cmd;%PATH%"

where git >nul 2>&1
if %errorlevel% equ 0 (
    for /f "tokens=*" %%v in ('git --version 2^>nul') do set GIT_VER=%%v
    echo       √ Git 已安装: !GIT_VER!
) else (
    echo       Git 未安装，正在通过 winget 安装...
    winget install Git.Git --accept-source-agreements --accept-package-agreements
    if !errorlevel! neq 0 (
        echo       [警告] winget 安装失败，请手动从 https://git-scm.com/ 下载 Git
    )
    set "PATH=C:\Program Files\Git\cmd;%PATH%"
)
echo.

:: -----------------------------------------------------------
:: 步骤 3: 检查并安装 7-Zip
:: -----------------------------------------------------------
echo [3/8] 检查 7-Zip...

if exist "C:\Program Files\7-Zip\7z.exe" (
    echo       √ 7-Zip 已安装
) else (
    echo       7-Zip 未安装，正在通过 winget 安装...
    winget install 7zip.7zip --accept-source-agreements --accept-package-agreements
    if !errorlevel! neq 0 (
        echo       [警告] winget 安装失败，请手动从 https://www.7-zip.org/ 下载 7-Zip
    )
)
echo.

:: -----------------------------------------------------------
:: 步骤 4: 启用 Windows 开发者模式
:: -----------------------------------------------------------
echo [4/8] 启用 Windows 开发者模式（符号链接权限）...

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v AllowDevelopmentWithoutDevLicense 2>nul | findstr "0x1" >nul 2>&1
if %errorlevel% equ 0 (
    echo       √ Windows 开发者模式已启用
) else (
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v AllowDevelopmentWithoutDevLicense /t REG_DWORD /d 1 /f >nul 2>&1
    reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v AllowAllTrustedApps /t REG_DWORD /d 1 /f >nul 2>&1
    if !errorlevel! equ 0 (
        echo       √ Windows 开发者模式已成功启用
    ) else (
        echo       [警告] 启用失败，请手动在 设置 -^> 更新和安全 -^> 开发者选项 中启用
    )
)
echo.

:: -----------------------------------------------------------
:: 步骤 5: 配置 PATH 环境变量
:: -----------------------------------------------------------
echo [5/8] 配置 PATH 环境变量...

:: 读取当前用户 PATH
for /f "tokens=2*" %%a in ('reg query "HKCU\Environment" /v Path 2^>nul ^| findstr Path') do set "CURRENT_USER_PATH=%%b"

set "NEED_UPDATE=0"
set "NEW_PATH=!CURRENT_USER_PATH!"

:: 检查 Node.js 路径
echo !CURRENT_USER_PATH! | findstr /i "nodejs" >nul 2>&1
if !errorlevel! neq 0 (
    set "NEW_PATH=C:\Program Files\nodejs;!NEW_PATH!"
    set "NEED_UPDATE=1"
    echo       + 添加 Node.js 到 PATH
)

:: 检查 Git 路径
echo !CURRENT_USER_PATH! | findstr /i "Git\\cmd" >nul 2>&1
if !errorlevel! neq 0 (
    set "NEW_PATH=C:\Program Files\Git\cmd;!NEW_PATH!"
    set "NEED_UPDATE=1"
    echo       + 添加 Git 到 PATH
)

:: 检查 npm 全局路径
echo !CURRENT_USER_PATH! | findstr /i "Roaming\\npm" >nul 2>&1
if !errorlevel! neq 0 (
    set "NEW_PATH=%APPDATA%\npm;!NEW_PATH!"
    set "NEED_UPDATE=1"
    echo       + 添加 npm 全局路径到 PATH
)

if "!NEED_UPDATE!"=="1" (
    setx PATH "!NEW_PATH!" >nul 2>&1
    echo       √ PATH 已更新（新 cmd 窗口生效）
) else (
    echo       √ PATH 配置已完整，无需修改
)

:: 更新当前 session 的 PATH
set "PATH=C:\Program Files\nodejs;C:\Program Files\Git\cmd;%APPDATA%\npm;%PATH%"
echo.

:: -----------------------------------------------------------
:: 步骤 6: 清理干扰环境变量
:: -----------------------------------------------------------
echo [6/8] 清理干扰环境变量...

:: 检查并清理 ELECTRON_RUN_AS_NODE
reg query "HKCU\Environment" /v ELECTRON_RUN_AS_NODE >nul 2>&1
if %errorlevel% equ 0 (
    reg delete "HKCU\Environment" /v ELECTRON_RUN_AS_NODE /f >nul 2>&1
    echo       √ 已删除用户级 ELECTRON_RUN_AS_NODE
) else (
    echo       √ ELECTRON_RUN_AS_NODE 不存在（正常）
)

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v ELECTRON_RUN_AS_NODE >nul 2>&1
if %errorlevel% equ 0 (
    reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v ELECTRON_RUN_AS_NODE /f >nul 2>&1
    echo       √ 已删除系统级 ELECTRON_RUN_AS_NODE
)

:: 同时清除当前 session
set "ELECTRON_RUN_AS_NODE="
echo.

:: -----------------------------------------------------------
:: 步骤 7: 安装项目依赖
:: -----------------------------------------------------------
echo [7/8] 安装项目依赖 (npm install)...

:: 确定项目目录（脚本所在目录的上一级）
set "SCRIPT_DIR=%~dp0"
set "PROJECT_DIR=%SCRIPT_DIR%.."

:: 检查 package.json 是否存在
if not exist "%PROJECT_DIR%\package.json" (
    echo       [错误] 未找到 package.json！
    echo       请确保此脚本位于项目的 scripts/ 目录下。
    echo       当前检查路径: %PROJECT_DIR%
    echo.
    goto :verify
)

cd /d "%PROJECT_DIR%"
echo       项目目录: %CD%

where npm >nul 2>&1
if %errorlevel% neq 0 (
    echo       [错误] npm 命令不可用！
    echo       请先关闭此窗口，重新打开管理员 cmd，然后再次运行此脚本。
    echo       （Node.js 刚刚安装，需要新窗口才能生效）
    echo.
    goto :verify
)

:: 检查 node_modules 是否已存在
if exist "node_modules\.bin\electron-builder.cmd" (
    echo       √ node_modules 已存在，跳过安装
    echo       （如需重新安装，请先删除 node_modules 目录后重新运行脚本）
) else (
    echo       正在执行 npm install ...
    echo       （首次安装可能需要几分钟，请耐心等待）
    echo.
    call npm install
    if !errorlevel! neq 0 (
        echo.
        echo       [警告] npm install 执行出错，请检查网络连接后重试
        echo       也可以尝试设置镜像源后重试：
        echo         npm config set registry https://registry.npmmirror.com
        echo         npm install
    ) else (
        echo.
        echo       √ npm install 完成
    )
)
echo.

:: -----------------------------------------------------------
:: 步骤 8: 环境验证
:: -----------------------------------------------------------
:verify
echo [8/8] 验证环境...
echo.

set "PASS_COUNT=0"
set "FAIL_COUNT=0"

:: 验证 Node.js
where node >nul 2>&1
if %errorlevel% equ 0 (
    for /f "tokens=*" %%v in ('node --version 2^>nul') do (
        echo       [√] Node.js %%v
        set /a PASS_COUNT+=1
    )
) else (
    echo       [×] Node.js 未找到
    set /a FAIL_COUNT+=1
)

:: 验证 npm
where npm >nul 2>&1
if %errorlevel% equ 0 (
    for /f "tokens=*" %%v in ('npm --version 2^>nul') do (
        echo       [√] npm %%v
        set /a PASS_COUNT+=1
    )
) else (
    echo       [×] npm 未找到
    set /a FAIL_COUNT+=1
)

:: 验证 Git
where git >nul 2>&1
if %errorlevel% equ 0 (
    for /f "tokens=*" %%v in ('git --version 2^>nul') do (
        echo       [√] %%v
        set /a PASS_COUNT+=1
    )
) else (
    echo       [×] Git 未找到
    set /a FAIL_COUNT+=1
)

:: 验证 7-Zip
if exist "C:\Program Files\7-Zip\7z.exe" (
    echo       [√] 7-Zip 已安装
    set /a PASS_COUNT+=1
) else (
    echo       [×] 7-Zip 未找到
    set /a FAIL_COUNT+=1
)

:: 验证 Windows 开发者模式
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v AllowDevelopmentWithoutDevLicense 2>nul | findstr "0x1" >nul 2>&1
if %errorlevel% equ 0 (
    echo       [√] Windows 开发者模式已启用
    set /a PASS_COUNT+=1
) else (
    echo       [×] Windows 开发者模式未启用
    set /a FAIL_COUNT+=1
)

:: 验证 ELECTRON_RUN_AS_NODE 不存在
reg query "HKCU\Environment" /v ELECTRON_RUN_AS_NODE >nul 2>&1
if %errorlevel% neq 0 (
    echo       [√] ELECTRON_RUN_AS_NODE 不存在（正常）
    set /a PASS_COUNT+=1
) else (
    echo       [×] ELECTRON_RUN_AS_NODE 仍然存在（需要清理）
    set /a FAIL_COUNT+=1
)

:: 验证 node_modules
if exist "%PROJECT_DIR%\node_modules\.bin\electron-builder.cmd" (
    echo       [√] 项目依赖已安装
    set /a PASS_COUNT+=1
) else (
    echo       [×] 项目依赖未安装（需执行 npm install）
    set /a FAIL_COUNT+=1
)

:: 验证 Electron 二进制
if exist "%PROJECT_DIR%\node_modules\electron\dist\electron.exe" (
    echo       [√] Electron 二进制已下载
    set /a PASS_COUNT+=1
) else (
    echo       [×] Electron 二进制缺失
    set /a FAIL_COUNT+=1
)

echo.
echo ============================================================

if !FAIL_COUNT! equ 0 (
    echo   ✅ 所有检查通过！（!PASS_COUNT!/!PASS_COUNT!）
    echo.
    echo   环境已就绪，可以在新的 cmd 窗口中执行以下命令：
    echo.
    echo     cd %PROJECT_DIR%
    echo     npm run electron:dev          ^(开发模式^)
    echo     npm run dist:win              ^(打包 Windows 安装包^)
    echo.
    echo   注意：如果本次新安装了 Node.js 或 Git，
    echo   请关闭当前窗口，打开新的 cmd 窗口再执行以上命令。
) else (
    echo   ⚠ 有 !FAIL_COUNT! 项检查未通过，请根据上方提示处理。
    echo.
    echo   如果是首次安装了 Node.js / Git，请：
    echo     1. 关闭当前窗口
    echo     2. 打开新的管理员 cmd 窗口
    echo     3. 重新运行此脚本
)

echo ============================================================
echo.
pause
endlocal
