; NOTES:
;  - Prior to compiling this file, run "git clone https://github.com/DomGries/InnoDependencyInstaller"
;  - AppVersion must be defined on the commandline with /dAppVersion=""

#define public Dependency_Path_NetCoreCheck "InnoDependencyInstaller\dependencies\"
#include                                    "InnoDependencyInstaller\CodeDependencies.iss"        

#define SourceExeFilePath                   "publish\installer"

#define AppID                               "{33DFCEE8-022C-4C66-A366-79A7415320F2}"
#define AppName                             "Volume Control"
#define AppPublisher                        "radj307"
#define CurrentYear                         GetDateTimeString('yyyy','','')
#define AppURL                              "https://github.com/radj307/volume-control"
#define AppExeName                          "VolumeControl.exe"
#define AppMutex                            "VolumeControlSingleInstance"
#define AppFileVersion                      GetStringFileInfo(SourceExeFilePath + "\" + AppExeName, "FileVersion")
#define AppVersion                          GetStringFileInfo(SourceExeFilePath + "\" + AppExeName, "ProductVersion")

[Setup]
AppId={{#AppID}
AppName={#AppName}
AppVersion={#AppVersion}
AppVerName={#AppName} {#AppVersion}

AppCopyright=Copyright © 2022-{#CurrentYear} {#AppPublisher}
AppPublisherURL={#AppURL}
AppSupportURL={#AppURL}
AppUpdatesURL={#AppURL}

VersionInfoDescription={#AppName} installer
VersionInfoProductName={#AppName}
VersionInfoVersion={#AppFileVersion}

UninstallDisplayIcon={app}\{#AppExeName}
UninstallDisplayName={#AppName}
AppPublisher={#AppPublisher}

ShowLanguageDialog=yes
UsePreviousLanguage=no
LanguageDetectionMethod=uilanguage

WizardStyle=modern
WizardSizePercent=100

PrivilegesRequired=lowest
PrivilegesRequiredOverridesAllowed=dialog

LicenseFile=LICENSE

ArchitecturesInstallIn64BitMode=x64
DefaultDirName={autopf}\VolumeControl
DisableProgramGroupPage=yes
; OutputDir=publish
;DON'T CHANGE THIS ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ without also changing the name in UpdateChecker.cs
OutputBaseFilename=VolumeControl-Installer_{#AppVersion}
SetupIconFile=VolumeControl\Resources\icons\iconSilveredInstall.ico
Compression=lzma
SolidCompression=yes
AppMutex={#AppMutex}

[Languages]
Name: "english";    MessagesFile: "compiler:Default.isl"
Name: "french";     MessagesFile: "compiler:Languages\French.isl"
Name: "german";     MessagesFile: "compiler:Languages\German.isl"
Name: "italian";    MessagesFile: "compiler:Languages\Italian.isl"
Name: "portuguese"; MessagesFile: "compiler:Languages\Portuguese.isl"
Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "{#SourceExeFilePath}\{#AppExeName}"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{autoprograms}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

[UninstallDelete]
Type: dirifempty; Name: "{app}"

[Code]
function GetUninstallKey(): String;
begin
  Result := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
end;

function GetUninstallString(): String;
var
  sUnInstPath: String;
  sUnInstallString: String;
begin
  sUnInstPath := GetUninstallKey();
  sUnInstallString := '';
  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
  Result := sUnInstallString;
end;

function IsUpgrade(): Boolean;
begin
  Result := (GetUninstallString() <> '');
end;

function UnInstallOldVersion(): Integer;
var
  sUnInstallString: String;
  iResultCode: Integer;
begin
{ Return Values: }
{ 1 - uninstall string is empty }
{ 2 - error executing the UnInstallString }
{ 3 - successfully executed the UnInstallString }

  { default return value }
  Result := 0;

  { get the uninstall string of the old app }
  sUnInstallString := GetUninstallString();
  if sUnInstallString <> '' then begin
    sUnInstallString := RemoveQuotes(sUnInstallString);
    if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
      Result := 3
    else
      Result := 2;
  end else
    Result := 1;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep=ssInstall) then
  begin
    if (IsUpgrade()) then
    begin
      UnInstallOldVersion();
    end;
  end else if (CurStep=ssPostInstall) then begin
    RegWriteStringValue(HKEY_AUTO, GetUninstallKey(), 'DisplayVersion', '{#emit SetupSetting('AppVersion')}');
  end;
end;

function InitializeSetup: Boolean;
begin
  Dependency_AddDotNet60;
  Result := True;
end;

procedure InitializeWizard();
var
  i: Integer;
begin
  { Set the license memo text alignment to center & strip preceding whitespace }   
  WizardForm.LicenseMemo.Alignment := taCenter;
  for i:= WizardForm.LicenseMemo.Lines.Count downto 0 do
    WizardForm.LicenseMemo.Lines[i] := Trim(WizardForm.LicenseMemo.Lines[i]);
end;