@ECHO OFF
SETLOCAL

CD /D %~dp0

REM Check for the help switches
IF /I "%~1" == "help"   GOTO ShowHelp
IF /I "%~1" == "/help"  GOTO ShowHelp
IF /I "%~1" == "-help"  GOTO ShowHelp
IF /I "%~1" == "--help" GOTO ShowHelp
IF /I "%~1" == "/?"     GOTO ShowHelp
IF /I "%~1" == "-?"     GOTO ShowHelp

ECHO Getting latest changes...
git pull
ECHO.
ECHO Starting compilation...

REM Set environment variables for Visual Studio command line if necessary
:SetVsCmdLineEnv
IF DEFINED VSINSTALLDIR IF EXIST "%VSINSTALLDIR%" (
  IF DEFINED VisualStudioVersion IF "%VisualStudioVersion%" GEQ "15.0" GOTO SetBuildType
  ECHO.
  ECHO Developer Command Prompt for Visual Studio 2017 or later required!
  GOTO EndWithError
)
FOR /F "usebackq delims=" %%A IN (`vswhere -latest -requires Microsoft.Component.MSBuild -property installationPath`) DO (
  SET "VSINSTALLDIR=%%A\"
)
IF DEFINED VSINSTALLDIR IF EXIST "%VSINSTALLDIR%" (
  ECHO Visual Studio installation path: "%VSINSTALLDIR%"
) ELSE (
  ECHO.
  ECHO Cannot find Visual Studio.
  GOTO EndWithError
)
SET "VsDevCmd_bat=%VSINSTALLDIR%Common7\Tools\VsDevCmd.bat"
IF NOT EXIST "%VsDevCmd_bat%" (
  FOR /F "usebackq delims=" %%A IN (`DIR /B /S "%VSINSTALLDIR%\VsDevCmd.bat"`) DO (
    SET "VsDevCmd_bat=%%A"
  )
)
IF EXIST "%VsDevCmd_bat%" (
  ECHO Visual Studio VsDevCmd.bat path: "%VsDevCmd_bat%"
) ELSE (
  ECHO.
  ECHO Cannot find Visual Studio VsDevCmd batch file.
  GOTO EndWithError
)
ECHO.
CALL "%VsDevCmd_bat%" -startdir=none
GOTO SetVsCmdLineEnv


:SetBuildType
IF "%~1" == "" (
  SET "BUILDTYPE=Build"
) ELSE (
  IF /I "%~1" == "Build"     SET "BUILDTYPE=Build"   & GOTO START
  IF /I "%~1" == "/Build"    SET "BUILDTYPE=Build"   & GOTO START
  IF /I "%~1" == "-Build"    SET "BUILDTYPE=Build"   & GOTO START
  IF /I "%~1" == "--Build"   SET "BUILDTYPE=Build"   & GOTO START
  IF /I "%~1" == "Clean"     SET "BUILDTYPE=Clean"   & GOTO START
  IF /I "%~1" == "/Clean"    SET "BUILDTYPE=Clean"   & GOTO START
  IF /I "%~1" == "-Clean"    SET "BUILDTYPE=Clean"   & GOTO START
  IF /I "%~1" == "--Clean"   SET "BUILDTYPE=Clean"   & GOTO START
  IF /I "%~1" == "Rebuild"   SET "BUILDTYPE=Rebuild" & GOTO START
  IF /I "%~1" == "/Rebuild"  SET "BUILDTYPE=Rebuild" & GOTO START
  IF /I "%~1" == "-Rebuild"  SET "BUILDTYPE=Rebuild" & GOTO START
  IF /I "%~1" == "--Rebuild" SET "BUILDTYPE=Rebuild" & GOTO START

  ECHO.
  ECHO Unsupported commandline switch!
  GOTO EndWithError
)


:START
TITLE %BUILDTYPE%ing Subtitle Edit - Release^|Any CPU...
ECHO.
ECHO %BUILDTYPE%ing Subtitle Edit - Release^|Any CPU...
DEL /F /Q SubtitleEdit-*-Setup.exe SubtitleEdit-*.zip 2>NUL
ECHO.
ECHO Visual Studio installation path: "%VSINSTALLDIR%"
IF EXIST "%VSINSTALLDIR%MSBuild\15.0\Bin\MSBuild.exe" (
  SET "MSBUILD=%VSINSTALLDIR%MSBuild\15.0\Bin\MSBuild.exe"
) ELSE (
IF EXIST "%VSINSTALLDIR%MSBuild\Current\Bin\MSBuild.exe" (
  SET "MSBUILD=%VSINSTALLDIR%MSBuild\Current\Bin\MSBuild.exe"
) ELSE (
  ECHO Cannot find Visual Studio 2017.
  GOTO EndWithError
))

ECHO Check for new translation strings...
"%MSBUILD%" src\UpdateLanguageFiles\UpdateLanguageFiles.csproj /r /t:Rebuild /p:Configuration=Debug /p:Platform="Any CPU"^
 /maxcpucount /p:OutputPath=bin\debug /consoleloggerparameters:DisableMPLogging;Summary;Verbosity=minimal
SET "LanguageToolPath=src\UpdateLanguageFiles\bin\debug\UpdateLanguageFiles.exe"
IF NOT EXIST "%LanguageToolPath%" (
  ECHO Compile UpdateLanguageFiles!
)
"%LanguageToolPath%" "LanguageBaseEnglish.xml" "src\ui\Logic\LanguageDeserializer.cs"
ECHO.

"%MSBUILD%" SubtitleEdit.sln /r /t:%BUILDTYPE% /p:Configuration=Release /p:Platform="Any CPU"^
 /maxcpucount /consoleloggerparameters:DisableMPLogging;Summary;Verbosity=minimal
IF %ERRORLEVEL% NEQ 0 GOTO EndWithError

IF /I "%BUILDTYPE%" == "Clean" GOTO EndSuccessful

CALL :SubDetectSevenzipPath
IF DEFINED SEVENZIP IF EXIST "%SEVENZIP%" (
  CALL :SubGetVersion
  CALL :SubZipFile
)

CALL :SubDetectInnoSetup
IF DEFINED INNOSETUP IF EXIST "%INNOSETUP%" (
  TITLE Compiling installer with Inno Setup...
  ECHO.
  ECHO Compiling installer with Inno Setup...
  "%INNOSETUP%" /O"." /Q "installer\Subtitle_Edit_installer.iss"
  IF %ERRORLEVEL% NEQ 0 GOTO EndWithError

  ECHO.
  ECHO Installer compiled successfully!
) ELSE (
  ECHO Inno Setup wasn't found; the installer wasn't built.
)




SET "WinGetFix=src\UpdateAssemblyInfo\bin\Release\net48\win-x64\UpdateAssemblyInfo.exe"
IF NOT EXIST "%WinGetFix%" (
  ECHO Compile UpdateAssemblyInfo!
)
"%WinGetFix%" "winget" 
ECHO.
ECHO Validate with: winget validate --manifest C:\git\subtitleedit\winget
ECHO Test with    : winget install --manifest C:\git\subtitleedit\winget
ECHO Submit with  : wingetcreate submit C:\git\subtitleedit\winget
pause


:EndSuccessful
TITLE %BUILDTYPE%ing Subtitle Edit finished!
GOTO END


:EndWithError
TITLE Compiling Subtitle Edit [ERROR]
ECHO.
ECHO.
ECHO  ** ERROR: Build failed and aborted! **
GOTO END


:ShowHelp
TITLE %~nx0 %1
ECHO.
ECHO.
ECHO Usage:   %~nx0 [Clean^|Build^|Rebuild]
ECHO.
ECHO Notes:   You can also prefix the commands with "-", "--" or "/".
ECHO          The arguments are not case sensitive.
ECHO.
ECHO Executing %~nx0 without any arguments is equivalent to "%~nx0 build".


:END
ECHO.
ECHO.
ENDLOCAL
PAUSE
EXIT /B


:SubZipFile
TITLE Creating ZIP archive with 7-Zip...
ECHO.
ECHO Creating ZIP archive with 7-Zip...
PUSHD "src\ui\bin\Release\net48"
IF EXIST "temp_zip"                  RD /S /Q "temp_zip"
IF NOT EXIST "temp_zip"              MD "temp_zip"
IF NOT EXIST "temp_zip\Languages"    MD "temp_zip\Languages"
IF NOT EXIST "temp_zip\Dictionaries" MD "temp_zip\Dictionaries"
IF NOT EXIST "temp_zip\Ocr"          MD "temp_zip\Ocr"
IF NOT EXIST "temp_zip\Tesseract302" MD "temp_zip\Tesseract302"
IF NOT EXIST "temp_zip\Icons"        MD "temp_zip\Icons"
IF NOT EXIST "temp_zip\Icons\DefaultTheme"        MD "temp_zip\Icons\DefaultTheme"
IF NOT EXIST "temp_zip\Icons\DefaultTheme\VideoPlayer"        MD "temp_zip\Icons\DefaultTheme\VideoPlayer"
IF NOT EXIST "temp_zip\Icons\DarkTheme"        MD "temp_zip\Icons\DarkTheme"
IF NOT EXIST "temp_zip\Icons\DarkTheme\VideoPlayer"        MD "temp_zip\Icons\DarkTheme\VideoPlayer"
IF NOT EXIST "temp_zip\Icons\Legacy"        MD "temp_zip\Icons\Legacy"
IF NOT EXIST "temp_zip\Icons\Legacy\VideoPlayer"        MD "temp_zip\Icons\Legacy\VideoPlayer"
IF NOT EXIST "temp_zip\Icons\Black"        MD "temp_zip\Icons\Black"
IF NOT EXIST "temp_zip\Icons\Black\VideoPlayer"        MD "temp_zip\Icons\Black\VideoPlayer"

ECHO.
COPY /Y /V "..\..\..\..\..\LICENSE.txt"               "temp_zip\"
COPY /Y /V "..\..\..\..\..\Changelog.txt"             "temp_zip\"
COPY /Y /V "..\..\..\..\..\preview.mkv"               "temp_zip\"
COPY /Y /V "Hunspellx86.dll"                       "temp_zip\"
COPY /Y /V "Hunspellx64.dll"                       "temp_zip\"
COPY /Y /V "libse.dll"                             "temp_zip\"
COPY /Y /V "zlib.net.dll"                          "temp_zip\"
COPY /Y /V "NHunspell.dll"                         "temp_zip\"
COPY /Y /V "UtfUnknown.dll"                        "temp_zip\"
COPY /Y /V "Vosk.dll"                              "temp_zip\"
COPY /Y /V "NCalc.dll"                             "temp_zip\"
MD "temp_zip\x86"
MD "temp_zip\x64"
COPY /Y /V "x86\7zxa.dll"                          "temp_zip\x86\"
COPY /Y /V "x64\7zxa.dll"                          "temp_zip\x64\"
COPY /Y /V "..\..\..\DLLs\Interop.QuartzTypeLib.dll"  "temp_zip\"
COPY /Y /V "System.Net.Http.Extensions.dll"        "temp_zip\"
COPY /Y /V "Newtonsoft.Json.dll"                   "temp_zip\"
COPY /Y /V "System.Net.Http.Primitives.dll"        "temp_zip\"
COPY /Y /V "NAudio.Core.dll"                       "temp_zip\"
COPY /Y /V "NAudio.WinMM.dll"                      "temp_zip\"
COPY /Y /V "Microsoft.Win32.Registry.dll"          "temp_zip\"
COPY /Y /V "SubtitleEdit.exe"                      "temp_zip\"
COPY /Y /V "Languages\*.xml"                       "temp_zip\Languages\"
COPY /Y /V "..\..\..\..\..\Dictionaries\*.*"          "temp_zip\Dictionaries\"
COPY /Y /V "..\..\..\..\..\Ocr\*.*"                   "temp_zip\Ocr\"
XCOPY /Y /V "..\..\..\..\..\Tesseract302\*.*"         "temp_zip\Tesseract302\" /S
COPY /Y /V "..\..\..\..\..\Icons\*.ico"               "temp_zip\Icons\"
COPY /Y /V "..\..\..\..\..\Icons\*.png"               "temp_zip\Icons\"
COPY /Y /V "..\..\..\..\..\Icons\DefaultTheme\*.png"               "temp_zip\Icons\DefaultTheme"
COPY /Y /V "..\..\..\..\..\Icons\DefaultTheme\VideoPlayer\*.png"               "temp_zip\Icons\DefaultTheme\VideoPlayer"
COPY /Y /V "..\..\..\..\..\Icons\DarkTheme\*.png"               "temp_zip\Icons\DarkTheme"
COPY /Y /V "..\..\..\..\..\Icons\DarkTheme\VideoPlayer\*.png"               "temp_zip\Icons\DarkTheme\VideoPlayer"
COPY /Y /V "..\..\..\..\..\Icons\Legacy\*.png"               "temp_zip\Icons\Legacy"
COPY /Y /V "..\..\..\..\..\Icons\Legacy\VideoPlayer\*.png"               "temp_zip\Icons\Legacy\VideoPlayer"
COPY /Y /V "..\..\..\..\..\Icons\Black\*.png"               "temp_zip\Icons\Black"
COPY /Y /V "..\..\..\..\..\Icons\Black\VideoPlayer\*.png"               "temp_zip\Icons\Black\VideoPlayer"

PUSHD "temp_zip"
START "" /B /WAIT "%SEVENZIP%" a -tzip -mx=9 "SubtitleEdit-%VERSION%.zip" * >NUL
IF %ERRORLEVEL% NEQ 0 GOTO EndWithError

ECHO.
ECHO ZIP archive created successfully!
MOVE /Y "SubtitleEdit-%VERSION%.zip" "..\..\..\..\..\.." >NUL
POPD
IF EXIST "temp_zip" RD /S /Q "temp_zip"
POPD

EXIT /B


:SubGetVersion
FOR /F delims^=^"^ tokens^=2 %%A IN ('FINDSTR /R /C:"AssemblyVersion" "src\ui\Properties\AssemblyInfo.cs.template"') DO (
  REM 3.4.1.[REVNO]
  SET "VERSION=%%A"
)
REM 3.4.1: 0 from the left and -8 chars from the right
SET "VERSION=%VERSION:~0,-8%"
EXIT /B


:SubDetectSevenzipPath
FOR %%G IN (7z.exe) DO (SET "SEVENZIP_PATH=%%~$PATH:G")
IF EXIST "%SEVENZIP_PATH%" (SET "SEVENZIP=%SEVENZIP_PATH%" & EXIT /B)

FOR %%G IN (7za.exe) DO (SET "SEVENZIP_PATH=%%~$PATH:G")
IF EXIST "%SEVENZIP_PATH%" (SET "SEVENZIP=%SEVENZIP_PATH%" & EXIT /B)

FOR /F "tokens=2*" %%A IN (
  'REG QUERY "HKLM\SOFTWARE\7-Zip" /v "Path" 2^>NUL ^|^|
   REG QUERY "HKLM\SOFTWARE\Wow6432Node\7-Zip" /v "Path" 2^>NUL') DO IF "%%A" == "REG_SZ" SET "SEVENZIP=%%B\7z.exe"
EXIT /B


:SubDetectInnoSetup
FOR %%G IN (ISCC.exe) DO (SET "INNOSETUP_PATH=%%~$PATH:G")
IF EXIST "%INNOSETUP_PATH%" (SET "INNOSETUP=%INNOSETUP_PATH%" & EXIT /B)

FOR /F "tokens=5*" %%A IN (
  'REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 6_is1" /v "Inno Setup: App Path" 2^>NUL ^|^|
   REG QUERY "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 6_is1" /v "Inno Setup: App Path" 2^>NUL') DO IF "%%A" == "REG_SZ" SET "INNOSETUP=%%B\ISCC.exe"
EXIT /B
