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

:: ============================================================
:: WBX Spring Core — Windows 설치 스크립트
:: 사용법: scripts\install.bat
:: ============================================================

:: ---------- 프로젝트 루트 설정 ----------
set "PROJECT_ROOT=%~dp0.."
pushd "!PROJECT_ROOT!" || (
    echo [FAIL] 프로젝트 루트를 찾을 수 없습니다: %~dp0..
    exit /b 1
)

echo.
echo ==========================================
echo  WBX Spring Core — 설치 점검
echo ==========================================
echo.

set ERRORS=0

:: ---------- 1. JDK 21 ----------
echo 1. JDK 확인
set "JDK_OK=0"
where java >nul 2>&1
if !ERRORLEVEL! equ 0 (
    for /f "tokens=3" %%v in ('java -version 2^>^&1 ^| findstr /i "version"') do (
        set "JAVA_FULL=%%~v"
    )
    for /f "tokens=1 delims=." %%m in ("!JAVA_FULL!") do set "JAVA_MAJOR=%%m"
    if !JAVA_MAJOR! GEQ 21 (
        echo   [OK] JDK !JAVA_FULL!
        set "JDK_OK=1"
    ) else (
        echo   [INFO] JDK !JAVA_FULL! — 21 이상 필요, 자동 설치 시도...
    )
) else (
    echo   [INFO] java 명령어 없음 — 자동 설치 시도...
)

if !JDK_OK! equ 0 (
    where winget >nul 2>&1
    if !ERRORLEVEL! equ 0 (
        echo   [INFO] winget으로 Eclipse Temurin JDK 21 설치 중...
        winget install --id EclipseAdoptium.Temurin.21.JDK --accept-source-agreements --accept-package-agreements --silent
        if !ERRORLEVEL! equ 0 (
            :: 설치된 JDK를 PATH에 추가
            for /d %%j in ("C:\Program Files\Eclipse Adoptium\jdk-21*") do (
                set "JAVA_HOME=%%j"
            )
            if defined JAVA_HOME (
                set "PATH=!JAVA_HOME!\bin;!PATH!"
                echo   [OK] JDK 21 설치 완료 — !JAVA_HOME!
                echo   [INFO] 시스템 PATH 반영을 위해 설치 후 새 터미널을 여세요.
            ) else (
                echo   [FAIL] JDK 설치 경로를 찾을 수 없습니다
                set /a ERRORS+=1
            )
        ) else (
            echo   [FAIL] JDK 설치 실패 — 수동으로 JDK 21을 설치하세요
            set /a ERRORS+=1
        )
    ) else (
        echo   [FAIL] winget 없음 — https://adoptium.net 에서 JDK 21을 수동 설치하세요
        set /a ERRORS+=1
    )
)

:: ---------- 2. Git ----------
echo 2. Git 확인
where git >nul 2>&1
if !ERRORLEVEL! equ 0 (
    for /f "delims=" %%g in ('git --version') do echo   [OK] %%g
) else (
    echo   [FAIL] git 없음
    set /a ERRORS+=1
)

:: ---------- 3. Docker (선택) ----------
echo 3. Docker 확인 (선택)
where docker >nul 2>&1
if !ERRORLEVEL! equ 0 (
    for /f "delims=" %%d in ('docker --version') do echo   [OK] %%d
) else (
    echo   [WARN] Docker 미설치 — DB/Redis를 직접 설치해야 합니다
)

:: ---------- 4. Redis 확인 ----------
echo 4. Redis 확인
set "REDIS_OK=0"
where redis-cli >nul 2>&1
if !ERRORLEVEL! equ 0 (
    redis-cli -h localhost -p 6379 ping 2>nul | findstr /i "PONG" >nul 2>&1
    if !ERRORLEVEL! equ 0 (
        echo   [OK] Redis 응답 OK
        set "REDIS_OK=1"
    )
)
if !REDIS_OK! equ 0 (
    where docker >nul 2>&1
    if !ERRORLEVEL! equ 0 (
        docker ps --format "{{.Names}}" 2>nul | findstr /i "redis" >nul 2>&1
        if !ERRORLEVEL! equ 0 (
            echo   [OK] Redis Docker 컨테이너 실행 중
        ) else (
            echo   [INFO] Redis 미실행 — Docker로 자동 시작...
            docker run -d --name redis -p 6379:6379 redis:7-alpine >nul 2>&1
            if !ERRORLEVEL! equ 0 (
                echo   [OK] Redis 컨테이너 시작 완료
            ) else (
                echo   [WARN] Redis 자동 시작 실패 — 수동으로 Redis를 실행하세요
            )
        )
    ) else (
        echo   [WARN] Redis 연결 불가 — Redis를 설치/실행하세요
    )
)

:: ---------- 5. MySQL 연결 확인 ----------
echo 5. MySQL 연결 확인
where mysql >nul 2>&1
if !ERRORLEVEL! equ 0 (
    mysql -h"%DB_HOST%" -P"%DB_PORT%" -u"%DB_USER%" -p"%DB_PASS%" -e "USE %DB_NAME%;" >nul 2>&1
    if !ERRORLEVEL! equ 0 (
        echo   [OK] MySQL 연결 OK ^(%DB_USER%@%DB_HOST%:%DB_PORT%/%DB_NAME%^)
    ) else (
        echo   [WARN] MySQL 연결 실패 — .env 의 DB 설정을 확인하세요
    )
) else (
    echo   [INFO] mysql 클라이언트 없음 — DB 연결은 앱 시작 시 확인됩니다
)

:: ---------- 6. 빌드 ----------
echo 6. Gradle 빌드
if !ERRORS! GTR 0 (
    echo   [FAIL] 사전 요구사항 미충족 — 빌드 건너뜀
) else (
    call "!PROJECT_ROOT!\gradlew.bat" build -x test --console=plain -q
    if !ERRORLEVEL! equ 0 (
        echo   [OK] BUILD SUCCESSFUL
    ) else (
        echo   [FAIL] 빌드 실패
        set /a ERRORS+=1
    )
)

:: ---------- 7. .env 템플릿 ----------
echo 7. 환경변수 파일
if not exist "!PROJECT_ROOT!\.env" (
    (
        echo # ===== WBX Spring Core — 환경변수 =====
        echo # 이 파일을 환경에 맞게 수정하세요.
        echo.
        echo # --- 프로필 ---
        echo SPRING_PROFILES_ACTIVE=prod,mysql
        echo.
        echo # --- 서버 ---
        echo SERVER_CONTEXT_PATH=/
        echo.
        echo # --- JWT ^(필수 변경^^^!^) ---
        echo JWT_SECRET=your-production-secret-key-minimum-256-bits-long
        echo.
        echo # --- DB ---
        echo DB_HOST=ws.ubuilder.co.kr
        echo DB_PORT=3306
        echo DB_NAME=mos
        echo DB_USER=jsh
        echo DB_PASS=jsh@
        echo.
        echo # --- Redis ---
        echo SPRING_DATA_REDIS_HOST=localhost
        echo.
        echo # --- CORS ---
        echo CORS_ORIGINS=https://app.company.com
        echo.
        echo # --- 로그 경로 ---
        echo LOG_PATH=D:\wbx-app\logs\app.log
        echo.
        echo # --- Azure SSO ^(azure 프로필 사용 시^) ---
        echo # AZURE_CLIENT_ID=
        echo # AZURE_CLIENT_SECRET=
        echo # AZURE_TENANT_ID=
        echo.
        echo # --- Azure Blob Storage ---
        echo # AZURE_STORAGE_ACCOUNT=
        echo # AZURE_STORAGE_KEY=
        echo # AZURE_CONTAINER=uploads
        echo.
        echo # --- AWS Cognito ^(aws 프로필 사용 시^) ---
        echo # AWS_COGNITO_CLIENT_ID=
        echo # AWS_COGNITO_CLIENT_SECRET=
        echo # AWS_USER_POOL_ID=
        echo # AWS_REGION=ap-northeast-2
        echo.
        echo # --- AWS S3 ---
        echo # AWS_S3_BUCKET=
        echo # AWS_ACCESS_KEY=
        echo # AWS_SECRET_KEY=
    ) > "!PROJECT_ROOT!\.env"
    echo   [OK] .env 생성 완료 (값을 수정하세요)
) else (
    echo   [WARN] .env 이미 존재 — 건너뜀
)

:: ---------- 8. 디렉토리 ----------
echo 8. 디렉토리 생성
if not exist "!PROJECT_ROOT!\logs" mkdir "!PROJECT_ROOT!\logs"
if not exist "!PROJECT_ROOT!\uploads" mkdir "!PROJECT_ROOT!\uploads"
if not exist "!PROJECT_ROOT!\backup" mkdir "!PROJECT_ROOT!\backup"
echo   [OK] logs\ uploads\ backup\

:: ---------- 결과 ----------
echo.
echo ==========================================
if !ERRORS! equ 0 (
    echo  설치 점검 완료
    echo.
    echo  다음 단계:
    echo    1. .env 파일을 환경에 맞게 수정
    echo    2. DB 생성 ^(또는 docker compose -f docker-compose-dev.yml up -d^)
    echo    3. gradlew.bat bootRun
    echo    4. http://localhost:8080/actuator/health 확인
) else (
    echo  오류 !ERRORS!건 — 위의 [FAIL] 항목을 해결하세요
)
echo ==========================================
echo.

popd
endlocal
