!include "MUI2.nsh"

;--------------------------------

; The name of the installer
Name "Univerxel @CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@"

Icon "../resource/package/univerxel.ico"
!define MUI_ICON "../resource/package/univerxel.ico"

; Request application privileges for Windows Vista and higher
RequestExecutionLevel user

; Build Unicode installer
Unicode True

SetCompressor /SOLID LZMA

; The default installation directory
InstallDir $LOCALAPPDATA\Univerxel

; Registry key to check for directory (so if you install again, it will 
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\Univerxel" "Install_Dir"

VIAddVersionKey "CompanyName" "Shu"
VIAddVersionKey "FileDescription" "Univerxel installer"
VIAddVersionKey "ProductName" "Univerxel installer"
VIAddVersionKey "LegalCopyright" "MIT - Shu"
VIAddVersionKey "FileVersion" "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@"
VIProductVersion "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@.1"

OutFile "Univerxel-installer.exe"

;--------------------------------
;Variables

  Var StartMenuFolder

;--------------------------------

; Pages

!define MUI_ABORTWARNING

!define MUI_COMPONENTSPAGE_NODESC
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Univerxel"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" 
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Univerxel" 
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

;--------------------------------
Function WordFind2X
	!define WordFind2X `!insertmacro WordFind2XCall`
 
	!macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT
		Push `${_STRING}`
		Push `${_DELIMITER1}`
		Push `${_DELIMITER2}`
		Push `${_NUMBER}`
		Call WordFind2X
		Pop ${_RESULT}
	!macroend
 
	Exch $2
	Exch
	Exch $1
	Exch
	Exch 2
	Exch $0
	Exch 2
	Exch 3
	Exch $R0
	Exch 3
	Push $3
	Push $4
	Push $5
	Push $6
	Push $7
	Push $8
	Push $9
	Push $R1
	Push $R2
	ClearErrors
 
	StrCpy $R2 ''
	StrCpy $3 $2 1
	StrCpy $2 $2 '' 1
	StrCmp $3 'E' 0 +3
	StrCpy $R2 E
	goto -4
 
	StrCmp $3 '+' +5
	StrCmp $3 '-' +4
	StrCmp $3 '#' restart
	StrCmp $3 '/' restart
	goto error3
 
	StrCpy $4 $2 2 -2
	StrCmp $4 '{{' +9
	StrCmp $4 '}}' +8
	StrCmp $4 '{*' +7
	StrCmp $4 '*{' +6
	StrCmp $4 '*}' +5
	StrCmp $4 '}*' +4
	StrCmp $4 '{}' +3
	StrCpy $4 ''
	goto +2
	StrCpy $2 $2 -2
	IntOp $2 $2 + 0
	StrCmp $2 0 error2
 
	restart:
	StrCmp $R0 '' error1
	StrCpy $5 -1
	StrCpy $6 0
	StrCpy $7 ''
	StrLen $8 $0
	StrLen $9 $1
 
	loop:
	IntOp $5 $5 + 1
 
	delim1:
	StrCpy $R1 $R0 $8 $5
	StrCmp $R1$6 0 error1
	StrCmp $R1 '' minus
	StrCmp $R1 $0 +2
	StrCmp $7 '' loop delim2
	StrCmp $0 $1 0 +2
	StrCmp $7 '' 0 delim2
	IntOp $7 $5 + $8
	StrCpy $5 $7
	goto delim1
 
	delim2:
	StrCpy $R1 $R0 $9 $5
	StrCmp $R1 $1 0 loop
	IntOp $6 $6 + 1
	StrCmp $3$6 '+$2' plus
	StrCmp $3 '/' 0 nextword
	IntOp $R1 $5 - $7
	StrCpy $R1 $R0 $R1 $7
	StrCmp $R1 $2 0 +3
	StrCpy $R1 $6
	goto end
	nextword:
	IntOp $5 $5 + $9
	StrCpy $7 ''
	goto delim1
 
	minus:
	StrCmp $3 '-' 0 sum
	StrCpy $3 +
	IntOp $2 $6 - $2
	IntOp $2 $2 + 1
	IntCmp $2 0 error2 error2 restart
	sum:
	StrCmp $3 '#' 0 error2
	StrCpy $R1 $6
	goto end
 
	plus:
	StrCmp $4 '' 0 +4
	IntOp $R1 $5 - $7
	StrCpy $R1 $R0 $R1 $7
	goto end
	IntOp $5 $5 + $9
	IntOp $7 $7 - $8
	StrCmp $4 '{*' +2
	StrCmp $4 '*{' 0 +3
	StrCpy $R1 $R0 $5
	goto end
	StrCmp $4 '*}' +2
	StrCmp $4 '}*' 0 +3
	StrCpy $R1 $R0 '' $7
	goto end
	StrCmp $4 '}}' 0 +3
	StrCpy $R1 $R0 '' $5
	goto end
	StrCmp $4 '{{' 0 +3
	StrCpy $R1 $R0 $7
	goto end
	StrCmp $4 '{}' 0 error3
	StrCpy $5 $R0 '' $5
	StrCpy $7 $R0 $7
	StrCpy $R1 '$7$5'
	goto end
 
	error3:
	StrCpy $R1 3
	goto error
	error2:
	StrCpy $R1 2
	goto error
	error1:
	StrCpy $R1 1
	error:
	StrCmp $R2 'E' 0 +3
	SetErrors
 
	end:
	StrCpy $R0 $R1
 
	Pop $R2
	Pop $R1
	Pop $9
	Pop $8
	Pop $7
	Pop $6
	Pop $5
	Pop $4
	Pop $3
	Pop $2
	Pop $1
	Pop $0
	Exch $R0
FunctionEnd

; The stuff to install
Section "Check updates"
upretry:
  inetc::get /canceltext "Skip updates !" "https://framagit.org/api/v4/projects/67835/packages?page=1&per_page=1&sort=desc&order_by=created_at&package_type=generic&package_name=Univerxel" "$TEMP\packages.json" /end
  Pop $0
  StrCmp $0 "OK" updlok
  DetailPrint "Failed to check updates: $0"
  MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION "Failed to check updates, click IGNORE to skip updates" IDIGNORE upskip IDRETRY upretry
  Abort
updlok:
  FileOpen $4 "$TEMP\packages.json" r
  FileRead $4 $1 
  FileClose $4
  Delete "$TEMP\packages.json"
  ${WordFind2X} $1 `"version":"` `"` "E+1" $R0
  IfErrors 0 upcmp
upmal:
  DetailPrint "Malformed pacakges: $R0"
  MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION "Failed to check updates, click IGNORE to skip updates" IDIGNORE upskip IDRETRY upretry 
upcmp:
  StrCpy $4 $R0
  StrCmp $4 "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@" upskip upfound
upfound:
  DetailPrint "Update found: $R0"
  ${WordFind2X} $1 `"web_path":"` `"` "E+1" $R0
  IfErrors upmal 0
  StrCpy $3 $R0
  MessageBox MB_YESNO|MB_ICONINFORMATION "Version: $4 found, click YES to download new one" IDNO upskip
  ExecShell "open" "https://framagit.org/$3" SW_SHOWNORMAL
upskip:
  DetailPrint "Updates check done"
SectionEnd
Section "Dependencies"
  SectionIn RO
  SetOutPath $INSTDIR
  File "package\libcrypto-1_1-x64.dll"
  File "package\openssl-license.txt"

  ; Write the installation path into the registry
  WriteRegStr HKLM SOFTWARE\Univerxel "Install_Dir" "$INSTDIR"
  
  ; Write the uninstall keys for Windows
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "DisplayName" "Univerxel"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel" "NoRepair" 1
  WriteUninstaller "$INSTDIR\uninstall.exe"
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    CreateDirectory "$SMPROGRAMS\$StartMenuFolder"  
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
Section "All in one"
  SetOutPath $INSTDIR
  File "Release\univerxel.exe"
  File /r content
  SetOverwrite off
  File /oname=config.toml "..\resource\package\config.full.toml"
  SetOverwrite on
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Univerxel (Full).lnk" "$INSTDIR\univerxel.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
  !define MUI_FINISHPAGE_RUN "$INSTDIR\univerxel.exe"
  !define MUI_FINISHPAGE_RUN_NOTCHECKED
SectionEnd
Section /o "Client"
  SetOutPath $INSTDIR
  File "Release\univerxel-client.exe"
  File /r /x *.pem /x *.dict content
  SetOverwrite off
  File /oname=config.toml "..\resource\package\config.client.toml"
  SetOverwrite on
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Univerxel (Client).lnk" "$INSTDIR\univerxel-client.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
Section /o "Server"
  SetOutPath $INSTDIR
  File "Release\univerxel-server.exe"
  CreateDirectory "$INSTDIR\content"
  File /oname=content\cert.pem content\cert.pem
  File /oname=content\key.pem content\key.pem
  File /oname=content\zstd.dict content\zstd.dict
  SetOverwrite off
  File /oname=config.toml "..\resource\package\config.server.toml"
  SetOverwrite on
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
    CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Univerxel (Server).lnk" "$INSTDIR\univerxel-server.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

;--------------------------------

; Uninstaller

Section "Uninstall"
  
  ; Remove registry keys
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Univerxel"
  DeleteRegKey HKLM SOFTWARE\Univerxel

  ; Remove files and uninstaller
  Delete "$INSTDIR\libcrypto-1_1-x64.dll"
  Delete "$INSTDIR\openssl-license.txt"
  Delete "$INSTDIR\univerxel.exe"
  Delete "$INSTDIR\univerxel-client.exe"
  Delete "$INSTDIR\univerxel-server.exe"
  RMDir /r "$INSTDIR\content"
  Delete "$INSTDIR\uninstall.exe"

  ; Remove shortcuts, if any
  !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
  Delete "$SMPROGRAMS\$StartMenuFolder\*.lnk"

  ; Remove directories
  RMDir /r "$SMPROGRAMS\$StartMenuFolder"
  RMDir /r "$INSTDIR"

  DeleteRegKey /ifempty HKCU "Software\Univerxel"

SectionEnd
