/* Copyright 2015 the SumatraPDF project authors (see AUTHORS file).
   License: GPLv3 */

#define EXENAME             APP_NAME_STR L".exe"

#define INSTALLER_FRAME_CLASS_NAME    L"SUMATRA_PDF_INSTALLER_FRAME"

#define INSTALLER_WIN_DX    420
#define INSTALLER_WIN_DY    340

#define WIN_BG_COLOR RGB(0xff, 0xf2, 0) // yellow

#define WINDOW_MARGIN   dpiAdjust(8)

/* The window is divided in three parts:
- top part, where we display nice graphics
- middle part, where we either display messages or advanced options
- bottom part, with install/uninstall button
*/

// This is the height of the lower part
extern int gBottomPartDy;

extern int gButtonDy;

// This is in HKLM. Note that on 64bit windows, if installing 32bit app
// the installer has to be 32bit as well, so that it goes into proper
// place in registry (under Software\Wow6432Node\Microsoft\Windows\...
#define REG_PATH_UNINST     L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" APP_NAME_STR

#define REG_CLASSES_APP     L"Software\\Classes\\" APP_NAME_STR
#define REG_CLASSES_PDF     L"Software\\Classes\\.pdf"
#define REG_CLASSES_APPS    L"Software\\Classes\\Applications\\" EXENAME

#define REG_EXPLORER_PDF_EXT  L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.pdf"
#define PROG_ID               L"ProgId"
#define APPLICATION           L"Application"

#ifndef _WIN64
#define REG_PATH_PLUGIN     L"Software\\MozillaPlugins\\@mozilla.zeniko.ch/SumatraPDF_Browser_Plugin"
#else
#define REG_PATH_PLUGIN     L"Software\\MozillaPlugins\\@mozilla.zeniko.ch/SumatraPDF_Browser_Plugin_x64"
#endif
#define PLUGIN_PATH         L"Path"

// Keys we'll set in REG_PATH_UNINST path

// REG_SZ, a path to installed executable (or "$path,0" to force the first icon)
#define DISPLAY_ICON L"DisplayIcon"
// REG_SZ, e.g "SumatraPDF" (APP_NAME_STR)
#define DISPLAY_NAME L"DisplayName"
// REG_SZ, e.g. "1.2" (CURR_VERSION_STR)
#define DISPLAY_VERSION L"DisplayVersion"
// REG_DWORD, get size of installed directory after copying files
#define ESTIMATED_SIZE L"EstimatedSize"
// REG_SZ, the current date as YYYYMMDD
#define INSTALL_DATE L"InstallDate"
// REG_DWORD, set to 1
#define NO_MODIFY L"NoModify"
// REG_DWORD, set to 1
#define NO_REPAIR L"NoRepair"
// REG_SZ, e.g. "Krzysztof Kowalczyk" (PUBLISHER_STR)
#define PUBLISHER L"Publisher"
// REG_SZ, command line for uninstaller
#define UNINSTALL_STRING L"UninstallString"
// REG_SZ, e.g. "http://www.sumatrapdfreader.org/"
#define URL_INFO_ABOUT L"URLInfoAbout"
// REG_SZ, e.g. "http://www.sumatrapdfreader.org/news.html"
#define URL_UPDATE_INFO L"URLUpdateInfo"
// REG_SZ, same as INSTALL_DIR below
#define INSTALL_LOCATION L"InstallLocation"

// Legacy key, only removed at uninstallation
#define REG_PATH_SOFTWARE   L"Software\\" APP_NAME_STR

#define ID_BUTTON_EXIT                11

#define WM_APP_INSTALLATION_FINISHED        (WM_APP + 1)

struct GlobalData {
    bool    silent;
    bool    showUsageAndQuit;
    WCHAR * installDir;
#ifndef BUILD_UNINSTALLER
    bool    registerAsDefault;
    bool    installPdfFilter;
    bool    installPdfPreviewer;
    bool    keepBrowserPlugin;
    bool    justExtractFiles;
    bool    autoUpdate;
#endif

    WCHAR * firstError;
    HANDLE  hThread;
    bool    success;
};

struct PayloadInfo {
    const char *fileName;
    bool install;
};

extern GlobalData   gGlobalData;
extern PayloadInfo  gPayloadData[];
extern WCHAR *      gSupportedExts[];
extern HWND         gHwndFrame;
extern HWND         gHwndButtonExit;
extern HWND         gHwndButtonInstUninst;
extern HFONT        gFontDefault;
extern WCHAR *      gMsgError;
extern bool         gShowOptions;
extern bool         gForceCrash;
extern bool         gReproBug;

extern Gdiplus::Color COLOR_MSG_WELCOME;
extern Gdiplus::Color COLOR_MSG_OK;
extern Gdiplus::Color COLOR_MSG_INSTALLATION;
extern Gdiplus::Color COLOR_MSG_FAILED;

void NotifyFailed(const WCHAR *msg);
void SetMsg(const WCHAR *msg, Gdiplus::Color color);
WCHAR *GetInstalledExePath();
WCHAR *GetInstalledBrowserPluginPath();
void OnCreateWindow(HWND hwnd);
void ShowUsage();
void CreateMainWindow();
const WCHAR *GetOwnPath();
bool OnWmCommand(WPARAM wParam);
bool CreateProcessHelper(const WCHAR *exe, const WCHAR *args=nullptr);
WCHAR *GetUninstallerPath();
int KillProcess(const WCHAR *processPath, bool waitUntilTerminated);
void UninstallBrowserPlugin();
void UninstallPdfFilter();
void UninstallPdfPreviewer();
void KillSumatra();
WCHAR *GetShortcutPath(bool allUsers);
void InvalidateFrame();
bool CheckInstallUninstallPossible(bool silent=false);
void CreateButtonExit(HWND hwndParent);
void OnButtonExit();
HWND CreateButton(HWND hwndParent, const WCHAR *s, int id, DWORD style, SIZE& sizeOut);
HWND CreateDefaultButton(HWND hwndParent, const WCHAR *s, int id);
SIZE SetButtonTextAndResize(HWND hwnd, const WCHAR * s);
SIZE GetIdealButtonSize(HWND hwnd);
int dpiAdjust(int value);
void InstallPdfFilter();
void InstallPdfPreviewer();

#ifdef BUILD_UNINSTALLER

bool ExecuteUninstallerFromTempDir();
BOOL IsUninstallerNeeded();
void OnUninstallationFinished();
DWORD WINAPI UninstallerThread(LPVOID data);

#else

extern HWND gHwndButtonRunSumatra;

bool IsValidInstaller();
void OnInstallationFinished();
bool IsPdfFilterInstalled();
bool IsPdfPreviewerInstalled();
DWORD WINAPI InstallerThread(LPVOID data);

#endif