@echo off
setlocal EnableExtensions EnableDelayedExpansion
title devstart - ja.kobbecker.de

:: -----------------------------------------------------------------------------
:: ja.kobbecker.de - local MkDocs dev server (mkdocs-terminal theme)
:: Prerequisites: Python 3.10+ on PATH (py -3 or python)
:: Override:      set JAKOBBECKER_DIR=C:\path\to\ja.kobbecker.de
:: -----------------------------------------------------------------------------

set "EXIT_OK=0"
set "EXIT_ERR=1"

if defined JAKOBBECKER_DIR (
    set "PROJECT_DIR=%JAKOBBECKER_DIR%"
) else (
    set "PROJECT_DIR=C:\Users\Jakob\Workspace\ja.kobbecker.de"
)

set "VENV_DIR=%PROJECT_DIR%\.venv"
set "MKDOCS_ADDR=127.0.0.1:8000"
set "MKDOCS_URL=http://%MKDOCS_ADDR%/"

call :MAIN
set "ERC=%ERRORLEVEL%"
endlocal & exit /b %ERC%

:: =============================================================================
:MAIN
call :INIT_UI

call :STEP 1 4 "Validating project"
if not exist "%PROJECT_DIR%\" goto ERR_PROJECT_DIR
if not exist "%PROJECT_DIR%\mkdocs.yml" goto ERR_MKDOCS_YML
call :PRINT_OK "Repository: %PROJECT_DIR%"
call :PRINT_OK "Config: mkdocs.yml"

call :STEP 2 4 "Checking Python"
call :RESOLVE_PYTHON
if errorlevel 1 goto ERR_PYTHON
call :PRINT_OK "Python: !PYTHON_CMD!"

call :STEP 3 4 "Preparing virtual environment"
call :ENSURE_VENV
if errorlevel 1 goto ERR_VENV
call :INSTALL_DEPS
if errorlevel 1 goto ERR_DEPS
call :PRINT_OK "Dependencies ready"

call :STEP 4 4 "Starting MkDocs dev server"
call :VERIFY_MKDOCS
if errorlevel 1 goto ERR_MKDOCS
call :START_MKDOCS_SERVER
call :PRINT_OK "Dev server terminal opened"
call :OPEN_CHROME
if errorlevel 1 (
    echo.
    call :PRINT_DIM "Open in browser:"
    echo   %C_CYAN%!MKDOCS_URL!%C_RESET%
) else (
    call :PRINT_OK "Opened in Chrome: !MKDOCS_URL!"
)
echo.
call :PRINT_DIM "Live reload enabled - Ctrl+C in the server window to stop"
exit /b !EXIT_OK!

:ERR_PROJECT_DIR
call :PRINT_ERR "Project directory not found: %PROJECT_DIR%"
exit /b !EXIT_ERR!

:ERR_MKDOCS_YML
call :PRINT_ERR "mkdocs.yml not found in %PROJECT_DIR%"
exit /b !EXIT_ERR!

:ERR_PYTHON
call :PRINT_ERR "Python 3 not found. Install Python and ensure py -3 or python works."
exit /b !EXIT_ERR!

:ERR_VENV
call :PRINT_ERR "Failed to create virtual environment in %VENV_DIR%"
exit /b !EXIT_ERR!

:ERR_DEPS
call :PRINT_ERR "Failed to install MkDocs dependencies"
exit /b !EXIT_ERR!

:ERR_MKDOCS
call :PRINT_ERR "mkdocs command not available after install"
exit /b !EXIT_ERR!

:RESOLVE_PYTHON
set "PYTHON_CMD="
where py >nul 2>&1 && (
    py -3 -c "import sys; raise SystemExit(0 if sys.version_info>=(3,10) else 1)" >nul 2>&1
    if not errorlevel 1 set "PYTHON_CMD=py -3"
)
if defined PYTHON_CMD exit /b 0
where python >nul 2>&1 && (
    python -c "import sys; raise SystemExit(0 if sys.version_info>=(3,10) else 1)" >nul 2>&1
    if not errorlevel 1 set "PYTHON_CMD=python"
)
if defined PYTHON_CMD exit /b 0
exit /b 1

:ENSURE_VENV
if exist "%VENV_DIR%\Scripts\python.exe" (
    call :PRINT_OK "Using existing .venv"
    exit /b 0
)
call :PRINT_DIM "Creating .venv ..."
!PYTHON_CMD! -m venv "%VENV_DIR%"
if errorlevel 1 exit /b 1
if not exist "%VENV_DIR%\Scripts\python.exe" exit /b 1
call :PRINT_OK "Created .venv"
exit /b 0

:INSTALL_DEPS
"%VENV_DIR%\Scripts\python.exe" -m pip install -q --no-cache-dir --upgrade pip
if errorlevel 1 exit /b 1
if exist "%PROJECT_DIR%\requirements.txt" (
    call :PRINT_DIM "Installing from requirements.txt ..."
    "%VENV_DIR%\Scripts\python.exe" -m pip install -q --no-cache-dir -r "%PROJECT_DIR%\requirements.txt"
) else (
    call :PRINT_DIM "Installing mkdocs + mkdocs-terminal ..."
    "%VENV_DIR%\Scripts\python.exe" -m pip install -q --no-cache-dir mkdocs mkdocs-terminal
)
if errorlevel 1 exit /b 1
exit /b 0

:VERIFY_MKDOCS
"%VENV_DIR%\Scripts\mkdocs.exe" --version >nul 2>&1
if errorlevel 1 exit /b 1
for /F "delims=" %%V in ('"%VENV_DIR%\Scripts\mkdocs.exe" --version 2^>nul') do call :PRINT_OK "%%V"
exit /b 0

:START_MKDOCS_SERVER
set "MKDOCS_SERVE_CMD=mkdocs serve --dev-addr %MKDOCS_ADDR%"
set "SERVE_CMD=cd /d ""%PROJECT_DIR%"" && call ""%VENV_DIR%\Scripts\activate.bat"" && echo. && echo   ja.kobbecker.de MkDocs && echo   !MKDOCS_URL! && echo   Ctrl+C to stop && echo   Start: !MKDOCS_SERVE_CMD! && echo. && !MKDOCS_SERVE_CMD!"
start "ja.kobbecker.de - MkDocs" cmd /k "%SERVE_CMD%"
exit /b 0

:OPEN_CHROME
set "CHROME_EXE="
if exist "%ProgramFiles%\Google\Chrome\Application\chrome.exe" set "CHROME_EXE=%ProgramFiles%\Google\Chrome\Application\chrome.exe"
if not defined CHROME_EXE if exist "%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe" set "CHROME_EXE=%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe"
if not defined CHROME_EXE if exist "%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe" set "CHROME_EXE=%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe"
if not defined CHROME_EXE (
    where chrome >nul 2>&1 && set "CHROME_EXE=chrome"
)
if not defined CHROME_EXE exit /b 1
call :PRINT_DIM "Waiting for dev server ..."
timeout /t 2 /nobreak >nul
start "" "%CHROME_EXE%" --new-tab "!MKDOCS_URL!"
exit /b 0

:INIT_UI
for /F "delims=" %%A in ('echo prompt $E^| cmd') do set "ESC=%%A"
set "C_RESET=%ESC%[0m"
set "C_BOLD=%ESC%[1m"
set "C_DIM=%ESC%[2m"
set "C_CYAN=%ESC%[36m"
set "C_GREEN=%ESC%[32m"
set "C_RED=%ESC%[31m"
exit /b 0

:STEP
echo.
echo   %C_DIM%[%~1/%~2]%C_RESET%  %C_BOLD%%~3%C_RESET%
exit /b 0

:PRINT_OK
echo   %C_GREEN%+%C_RESET%  %~1
exit /b 0

:PRINT_ERR
echo   %C_RED%x%C_RESET%  %~1
exit /b 0

:PRINT_DIM
echo   %C_DIM%%~1%C_RESET%
exit /b 0
