@echo off

REM ********************************************************************
REM
REM generate-project.bat
REM
REM This windows batch script generates a set of gameplay project files.
REM The new project will be based of the gameplay-template project and 
REM it will be generated with the name and location that is specified
REM as input parameters.
REM
REM IMPORTANT: This script must be run from the root of the gameplay
REM source tree.
REM
REM ********************************************************************

echo.
echo 1. Enter a name for the new project.
echo.
echo    This name will be given to the project 
echo    executable and a folder with this name
echo    will be created to store all project files.
echo.
set /p projName=Project name: 
if "%projName%" == "" (
    echo.
    echo ERROR: No project name specified.
    echo.
    pause
    goto done
)
echo.

echo.
echo 2. Enter a game title.
echo.
echo    On some platforms, this title is used to
echo    identify the game during installation and
echo    on shortcuts/icons.
echo.
set /p title=Title: 
if "%title%" == "" (
    echo.
    echo ERROR: No game title specified.
    echo.
    pause
    goto done
)
echo.

echo.
echo 3. Enter a short game description.
echo.
set /p desc=Description: 
if "%desc%" == "" (
    set desc=%title%
)
echo.

echo.
echo 4. Enter a unique identifier for your project.
echo.
echo    This should be a human readable package name,
echo    containing at least two words separated by a
echo    period (eg. com.surname.gamename).
echo.
set /p uuid=Unique ID: 
if "%uuid%" == "" (
    echo.
    echo ERROR: No uuid specified.
    echo.
    pause
    goto done
)
echo.

echo.
echo 5. Enter author name.
echo.
echo    On BlackBerry targets, this is used for
echo    signing and must match the developer name
echo    of your development certificate.
echo.
set /p author=Author: 
if "%author%" == "" (
    echo.
    echo ERROR: No author specified.
    echo.
    pause
    goto done
)
echo.

echo.
echo 6. Enter your game's main class name.
echo.
echo    Your initial game header and source file
echo    will be given this name and a class with 
echo    this name will be created in these files.
echo.
set /p className=Class name: 
if "%className%" == "" (
    echo.
    echo ERROR: No class name specified.
    echo.
    pause
    goto done
)
echo.

echo.
echo 7. Enter the project path.
echo.
echo    This can be a relative path, absolute path,
echo    or empty for the current folder. Note that
echo    a project folder named %projName% will also
echo    be created inside this folder.
echo.
set /p location=Path: 
if "%location%" == "" (
    set projPath=%projName%
) else (
    set projPath=%location%\%projName%
)
echo.

call:replacevar projPath "/" "\"

REM Does this path already exist?
if exist "%projPath%" (
    echo.
    echo ERROR: Path '%projPath%' already exists, aborting.
    echo.
    pause
    goto done

REM Disabling following code which prompts to overwrite existing path,
REM since this could be potentially damaging if the user specifies
REM an important path and then types 'y', without thinking.
REM
REM    set /p owd=Directory '%projPath%' exists, overwrite [Y,N]? 
REM    if not "!owd!" == "Y" (
REM        if not "!owd!" == "y" (
REM            echo Aborting.
REM            pause
REM            goto done
REM        )
REM    )
REM    rmdir /S /Q %projPath%
)

REM Generate relative path from project folder to GamePlay folder
set gpPath=%cd%
call:makerelative gpPath "%projPath%\"
call:replacevar gpPath "\" "/"

mkdir "%projPath%"
mkdir "%projPath%\src"
mkdir "%projPath%\res"

REM Copy Microsoft Visual Studio project files
copy gameplay-template\gameplay-template.vcxproj "%projPath%\%projName%.vcxproj"
call:replace "%projPath%\%projName%.vcxproj" TEMPLATE_PROJECT "%projName%"
call:replace "%projPath%\%projName%.vcxproj" TemplateGame "%className%"
call:replace "%projPath%\%projName%.vcxproj" GAMEPLAY_PATH "%gpPath%"

copy gameplay-template\gameplay-template.vcxproj.filters "%projPath%\%projName%.vcxproj.filters"
call:replace "%projPath%\%projName%.vcxproj.filters" TemplateGame "%className%"

copy gameplay-template\gameplay-template.vcxproj.user "%projPath%\%projName%.vcxproj.user"
call:replace "%projPath%\%projName%.vcxproj.user" GAMEPLAY_PATH "%gpPath%"

REM Copy Apple XCode project files
mkdir "%projPath%\%projName%.xcodeproj"
copy gameplay-template\gameplay-template.xcodeproj\project.pbxproj "%projPath%\%projName%.xcodeproj\project.pbxproj"
call:replace "%projPath%\%projName%.xcodeproj\project.pbxproj" GAMEPLAY_PATH "%gpPath%"
call:replace "%projPath%\%projName%.xcodeproj\project.pbxproj" TemplateGame "%className%"
call:replace "%projPath%\%projName%.xcodeproj\project.pbxproj" TEMPLATE_PROJECT "%projName%"

copy gameplay-template\TEMPLATE_PROJECT-macosx.plist "%projPath%\%projName%-macosx.plist"
call:replace "%projPath%\%projName%-macosx.plist" TEMPLATE_UUID "%uuid%"
call:replace "%projPath%\%projName%-macosx.plist" TEMPLATE_AUTHOR "%author%"

copy gameplay-template\TEMPLATE_PROJECT-ios.plist "%projPath%\%projName%-ios.plist"
copy gameplay-template\Default-568h@2x.png "%projPath%\Default-568h@2x.png"
call:replace "%projPath%\%projName%-ios.plist" TEMPLATE_TITLE "%title%"
call:replace "%projPath%\%projName%-ios.plist" TEMPLATE_UUID "%uuid%"
call:replace "%projPath%\%projName%-ios.plist" TEMPLATE_AUTHOR "%author%"

REM Copy BlackBerry NDK project files
copy gameplay-template\template.cproject "%projPath%\.cproject"
call:replace "%projPath%\.cproject" TEMPLATE_PROJECT "%projName%"
call:replace "%projPath%\.cproject" TEMPLATE_UUID "%uuid%"
call:replace "%projPath%\.cproject" GAMEPLAY_PATH "%gpPath%"

copy gameplay-template\template.project "%projPath%\.project"
call:replace "%projPath%\.project" TEMPLATE_PROJECT "%projName%"

copy gameplay-template\template.bar-descriptor.xml "%projPath%\bar-descriptor.xml"
call:replace "%projPath%\bar-descriptor.xml" TEMPLATE_PROJECT "%projName%"
call:replace "%projPath%\bar-descriptor.xml" TEMPLATE_TITLE "%title%"
call:replace "%projPath%\bar-descriptor.xml" TEMPLATE_UUID "%uuid%"
call:replace "%projPath%\bar-descriptor.xml" TEMPLATE_AUTHOR "%author%"
call:replace "%projPath%\bar-descriptor.xml" TEMPLATE_DESCRIPTION "%desc%"

REM Copy Android NDK project files
mkdir "%projPath%\android"

copy gameplay-template\android\template.AndroidManifest.xml "%projPath%\android\AndroidManifest.xml"
call:replace "%projPath%\android\AndroidManifest.xml" TEMPLATE_PROJECT "%projName%"
call:replace "%projPath%\android\AndroidManifest.xml" TEMPLATE_UUID "%uuid%"

copy gameplay-template\android\template.build.xml "%projPath%\android\build.xml"
call:replace "%projPath%\android\build.xml" TEMPLATE_PROJECT "%projName%"

mkdir "%projPath%\android\jni"

copy gameplay-template\android\jni\Application.mk "%projPath%\android\jni\Application.mk"

copy gameplay-template\android\jni\template.Android.mk "%projPath%\android\jni\Android.mk"
call:replace "%projPath%\android\jni\Android.mk" TemplateGame "%className%"
call:replace "%projPath%\android\jni\Android.mk" TEMPLATE_PROJECT "%projName%"
call:replace "%projPath%\android\jni\Android.mk" GAMEPLAY_PATH "%gpPath%"

mkdir "%projPath%\android\res\drawable"

copy gameplay-template\icon.png "%projPath%\android\res\drawable\icon.png"

mkdir "%projPath%\android\res\values"

copy gameplay-template\android\res\values\template.strings.xml "%projPath%\android\res\values\strings.xml"
call:replace "%projPath%\android\res\values\strings.xml" TEMPLATE_TITLE "%title%"

mkdir "%projPath%\build"
copy "gameplay-template\gameplay-template-CMakeLists.txt" "%projPath%\CMakeLists.txt"
call:replace "%projPath%\CMakeLists.txt" TEMPLATE_PROJECT %projName%
call:replace "%projPath%\CMakeLists.txt" TemplateGame %className%
call:replace "%projPath%\CMakeLists.txt" GAMEPLAY_PATH %gpPath%

REM Copy source files
copy gameplay-template\src\TemplateGame.h "%projPath%\src\%className%.h"
copy gameplay-template\src\TemplateGame.cpp "%projPath%\src\%className%.cpp"
call:replace "%projPath%\src\%className%.h" TemplateGame "%className%"
call:replace "%projPath%\src\%className%.cpp" TemplateGame "%className%"

REM Copy resource files
copy gameplay-template\res\* "%projPath%\res\"

REM Copy icon
copy gameplay-template\icon.png "%projPath%\icon.png"

REM Copy config
copy gameplay-template\game.config "%projPath%\game.config"
call:replace "%projPath%\game.config" TEMPLATE_TITLE "%title%"

REM Open new project folder
start "" "%projPath%"

goto done

:replace
set rtemp=%~1.rtemp
if exist "%rtemp%" del /Q "%rtemp%"
for /f "tokens=1* eol=€ delims=€]" %%j in ('type "%~1" ^| find /V /N ""') do (
    set line=%%k
    setlocal EnableDelayedExpansion
    if "!line!" == "" (
        echo.>>"%rtemp%"
    ) else (
        set linput=!line!
        set loutput=!linput:%~2=%~3!
        echo.!loutput!>>"%rtemp%"
    )
    endlocal
)
copy /Y "%rtemp%" "%~1"
del /Q "%rtemp%"
exit /b
goto done

:replacevar
setlocal EnableDelayedExpansion
echo !%~1!>.replacevar.tmp
endlocal
call:replace .replacevar.tmp "%~2" "%~3"
set /p replaced=<.replacevar.tmp
set %~1=%replaced%
del /Q .replacevar.tmp
exit /b
goto done

:makerelative
setlocal EnableDelayedExpansion
set src=%~1
if defined %1 set src=!%~1!
set bas=%~2
if not defined bas set bas=%cd%
for /f "tokens=*" %%a in ("%src%") do set src=%%~fa
for /f "tokens=*" %%a in ("%bas%") do set bas=%%~fa
set mat=&rem variable to store matching part of the name
set upp=&rem variable to reference a parent
for /f "tokens=*" %%a in ('echo.%bas:\=^&echo.%') do (
    set sub=!sub!%%a\
    call set tmp=%%src:!sub!=%%
    if "!tmp!" NEQ "!src!" (set mat=!sub!)ELSE (set upp=!upp!..\)
)
set src=%upp%!src:%mat%=!
( endlocal & REM RETURN VALUES
    IF defined %1 (SET %~1=%src%) ELSE ECHO.%src%
)
exit /b
goto done

:done
