; Script generated by the HM NIS Edit Script Wizard.

Target x86-unicode
Unicode True
!AddPluginDir /x86-unicode "."
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Stable Diffusion UI"
!define PRODUCT_VERSION "Installer 2.35"
!define PRODUCT_PUBLISHER "cmdr2 and contributors"
!define PRODUCT_WEB_SITE "https://stable-diffusion-ui.github.io"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Cmdr2\App Paths\installer.exe"

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"

Var Dialog
Var Label
Var Button

Var InstDirLen
Var LongPathsEnabled
Var AccountType

;---------------------------------------------------------------------------------------------------------
; This function returns the number of spaces in a string.
; The string is passed on the stack (using Push $STRING)
; The result is also returned on the stack and can be consumed with Pop $var
; https://nsis.sourceforge.io/Check_for_spaces_in_a_directory_path
Function CheckForSpaces
  Exch $R0
  Push $R1
  Push $R2
  Push $R3
  StrCpy $R1 -1
  StrCpy $R3 $R0
  StrCpy $R0 0
  loop:
    StrCpy $R2 $R3 1 $R1
    IntOp $R1 $R1 - 1
    StrCmp $R2 "" done
    StrCmp $R2 " " 0 loop
    IntOp $R0 $R0 + 1
  Goto loop
  done:
  Pop $R3
  Pop $R2
  Pop $R1
  Exch $R0
FunctionEnd

;---------------------------------------------------------------------------------------------------------
; The function DirectoryLeave is called after the user chose the installation directory.
; If it calls "abort", the user is sent back to choose a different directory.
Function DirectoryLeave
   ; check whether the installation directory path is longer than 30 characters.
   ; If yes, we suggest to the user to enable long filename support
   ;----------------------------------------------------------------------------
   StrLen $InstDirLen "$INSTDIR"

   ; Check whether the registry key that allows for >260 characters in a path name is set
   ReadRegStr $LongPathsEnabled HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled"

   ${If} $InstDirLen > 30
   ${AndIf} $LongPathsEnabled == "0"
      ; Check whether we're in the Admin group
      UserInfo::GetAccountType
      Pop $AccountType

      ${If} $AccountType == "Admin"
      ${AndIf} ${Cmd} `MessageBox MB_YESNO|MB_ICONQUESTION 'The path name is too long. $\n$\nYou can either enable long file name support in Windows,$\nor you can go back and choose a different path.$\n$\nFor details see: shorturl.at/auBD1$\n$\nEnable long path name support in Windows?' IDYES`
          ; Enable long path names
          WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1
      ${Else}
          MessageBox MB_OK|MB_ICONEXCLAMATION "Installation path name too long. The installation path must not have more than 30 characters."
          abort
      ${EndIf}
   ${EndIf}
   
   ; Check for spaces in the installation directory path.
   ; ----------------------------------------------------

   ; $R0 = CheckForSpaces( $INSTDIR )
   Push $INSTDIR # Input string (install path).
     Call CheckForSpaces
   Pop $R0 # The function returns the number of spaces found in the input string.

   ; Check if any spaces exist in $INSTDIR.
   ${If} $R0 != 0
     ; Plural if more than 1 space in $INSTDIR.
     ; If $R0 == 1: $R1 = ""; else: $R1 = "s"
     StrCmp $R0 1 0 +3
       StrCpy $R1 ""
     Goto +2
       StrCpy $R1 "s"

     ; Show message box then take the user back to the Directory page.
     MessageBox MB_OK|MB_ICONEXCLAMATION "Error: The Installaton directory \
     has $R0 space character$R1.$\nPlease choose an installation directory without space characters."
     Abort
   ${EndIf}
   
   ; Check for NTFS filesystem. Installations on FAT fail.
   ; -----------------------------------------------------
   StrCpy $5 $INSTDIR 3
   System::Call 'Kernel32::GetVolumeInformation(t "$5",t,i ${NSIS_MAX_STRLEN},*i,*i,*i,t.r1,i ${NSIS_MAX_STRLEN})i.r0'
   ${If} $0 <> 0
   ${AndIf} $1 == "NTFS"
       MessageBox mb_ok "$5 has filesystem type '$1'.$\nOnly NTFS filesystems are supported.$\nPlease choose a different drive."
       Abort
   ${EndIf}

FunctionEnd


;---------------------------------------------------------------------------------------------------------
; Open the MS download page in a browser and enable the [Next] button
Function MSMediaFeaturepack
    ExecShell "open" "https://www.microsoft.com/en-us/software-download/mediafeaturepack"

    GetDlgItem $0 $HWNDPARENT 1
    EnableWindow $0 1
FunctionEnd

;---------------------------------------------------------------------------------------------------------
; Install the MS Media Feature Pack, if it is missing (e.g. on Windows 10 N)
Function MediaPackDialog
    !insertmacro MUI_HEADER_TEXT "Windows Media Feature Pack" "Required software module is missing"

    ; Skip this dialog if mf.dll is installed
    ${If} ${FileExists} "$WINDIR\system32\mf.dll"
        Abort
    ${EndIf}
    
    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
	Abort
    ${EndIf}

    ${NSD_CreateLabel} 0 0 100% 48u "The Windows Media Feature Pack is missing on this computer. It is required for the Stable Diffusion UI.$\nYou can continue the installation after installing the Windows Media Feature Pack."
    Pop $Label
 	
    ${NSD_CreateButton} 10% 49u 80% 12u "Download Meda Feature Pack from Microsoft"
    Pop $Button

    GetFunctionAddress $0 MSMediaFeaturePack
    nsDialogs::OnClick $Button $0
    GetDlgItem $0 $HWNDPARENT 1
    EnableWindow $0 0
    nsDialogs::Show
FunctionEnd

;---------------------------------------------------------------------------------------------------------
; MUI Settings
;---------------------------------------------------------------------------------------------------------
!define MUI_ABORTWARNING
!define MUI_ICON "sd.ico"

!define MUI_WELCOMEFINISHPAGE_BITMAP "astro.bmp"

; Welcome page
!define MUI_WELCOMEPAGE_TEXT "This installer will guide you through the installation of Stable Diffusion UI.$\n$\n\
Click Next to continue."
!insertmacro MUI_PAGE_WELCOME
Page custom MediaPackDialog

; License page
!insertmacro MUI_PAGE_LICENSE "..\LICENSE"
!insertmacro MUI_PAGE_LICENSE "..\CreativeML Open RAIL-M License"
; Directory page
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "DirectoryLeave"
!insertmacro MUI_PAGE_DIRECTORY

; Instfiles page
!insertmacro MUI_PAGE_INSTFILES 

; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\Start Stable Diffusion UI.cmd"
!insertmacro MUI_PAGE_FINISH

; Language files
!insertmacro MUI_LANGUAGE "English"
;---------------------------------------------------------------------------------------------------------
; MUI end
;---------------------------------------------------------------------------------------------------------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Install Stable Diffusion UI.exe"
InstallDir "C:\Stable-Diffusion-UI\"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show

;---------------------------------------------------------------------------------------------------------
; List of files to be installed
Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  File "..\CreativeML Open RAIL-M License"
  File "..\How to install and run.txt"
  File "..\LICENSE"
  File "..\Start Stable Diffusion UI.cmd"
  SetOutPath "$INSTDIR\scripts"
  File "..\scripts\bootstrap.bat"
  File "..\scripts\install_status.txt"
  File "..\scripts\on_env_start.bat"
  File "C:\windows\system32\curl.exe"
  CreateDirectory "$INSTDIR\profile"
  CreateDirectory "$SMPROGRAMS\Stable Diffusion UI"
  CreateShortCut "$SMPROGRAMS\Stable Diffusion UI\Start Stable Diffusion UI.lnk" "$INSTDIR\Start Stable Diffusion UI.cmd"
SectionEnd

;---------------------------------------------------------------------------------------------------------
; Our installer only needs 25 KB, but once it has run, we need 25 GB
; So we need to overwrite the automatically detected space requirements.
; https://nsis.sourceforge.io/Docs/Chapter4.html#4.9.13.7
; The example in section 4.9.13.7 seems to be wrong: the number
; needs to be provided in Kilobytes.
Function .onInit
   ; Set required size of section 'SEC01' to 25 Gigabytes
   SectionSetSize ${SEC01} 26214400
  
  
   ; Check system meory size. We need at least 8GB
   ; ----------------------------------------------------

   ; allocate a few bytes of memory
   System::Alloc 64
   Pop $1

   ; Retrieve HW info from the Windows Kernel
   System::Call "*$1(i64)"
   System::Call "Kernel32::GlobalMemoryStatusEx(i r1)"
   ; unpack the data into $R2 - $R10
   System::Call "*$1(i.r2, i.r3, l.r4, l.r5, l.r6, l.r7, l.r8, l.r9, l.r10)"

   # free up the memory
   System::Free $1

   ; Result mapping:
   ; "Structure size: $2 bytes"
   ; "Memory load: $3%"
   ; "Total physical memory: $4 bytes"
   ; "Free physical memory: $5 bytes"
   ; "Total page file: $6 bytes"
   ; "Free page file: $7 bytes"
   ; "Total virtual: $8 bytes"
   ; "Free virtual: $9 bytes"

   ; Mem size in MB
   System::Int64Op $4 / 1048576
   Pop $4

   ${If} $4 < "8000"
      MessageBox MB_OK|MB_ICONEXCLAMATION "Warning!$\n$\nYour system has less than 8GB of memory (RAM).$\n$\n\
You can still try to install Stable Diffusion UI,$\nbut it might have problems to start, or run$\nvery slowly."
   ${EndIf}
  
FunctionEnd


;Section -Post
;  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\installer.exe"
;SectionEnd