/*
Silent installer script

Known to work with Qt 5.8.0 and QtIFW 2.0.5

Test with:
$ ./qt-opensource-windows-x86-mingw530-5.8.0.exe --verbose --script ../librepilot/make/tool_install/qt-install.qs

Known issues:
- silent but not headless (QtIFW 2.1.0 should support gui.setSilent(true))
- cannot disable forced components (QtCreator, ...)
 - cannot disable virtual components (doc, examples, ...)
 - cannot disable shortcuts creation
 - if user presses the 'Show Details' button then the installer does not end automatically
*/
function Controller()
{
    console.log("*** Silent Installer ***");
    console.log("Installing on " + installer.value("os"));

    var qtInstallTargetDir = installer.environmentVariable("QT_INSTALL_TARGET_DIR");
    if (qtInstallTargetDir == "") {
        qtInstallTargetDir = installer.environmentVariable("PWD") + "/tools/qt-5.8.0";
        console.log("Environment variable QT_INSTALL_TARGET_DIR not set, using default " + qtInstallTargetDir);
    }
    installer.setValue("TargetDir", qtInstallTargetDir);
    console.log("Installing to " + installer.value("TargetDir"));

    installer.autoRejectMessageBoxes();
    installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes);
    installer.setMessageBoxAutomaticAnswer("stopProcessesForUpdates", QMessageBox.Ignore);

    // pages that are not visible are actually removed from the wizard
    // some pages must not be removed otherwise the installer starts to mishbehave
    installer.setDefaultPageVisible(QInstaller.Welcome, false);
    installer.setDefaultPageVisible(QInstaller.Credentials, false); // QInstaller.Credentials is 0... so this is a NOP!
    //installer.setDefaultPageVisible(QInstaller.Introduction, false); // Fails to skip Credentials if Introduction is removed?
    installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
    //installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
    //installer.setDefaultPageVisible(QInstaller.LicenseAgreementCheck, false);
    //installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
    installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false);
    //installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
    installer.setDefaultPageVisible(QInstaller.FinishedPage, false);

    installer.componentAdded.connect(onComponentAdded);
    installer.aboutCalculateComponentsToInstall.connect(onAboutCalculateComponentsToInstall);
    installer.finishedCalculateComponentsToInstall.connect(onFinishedCalculateComponentsToInstall);
}

// installer callbacks

onComponentAdded = function(component)
{
    console.log("Component added: " + component.name);
    dumpComponents();
}

onAboutCalculateComponentsToInstall = function()
{
    console.log("onAboutCalculateComponentsToInstall");
    //dumpComponents();
}

onFinishedCalculateComponentsToInstall = function()
{
    console.log("onFinishedCalculateComponentsToInstall");
    //dumpComponents();
}

function disableComponent(componentName)
{
    component = installer.componentByName(componentName)
    component.enabled = false
    component.forcedInstallation = false
    //component.setValue("ForcedInstallation", "false");
}

// page callbacks
// used to setup wizard pages and move the wizard forward

Controller.prototype.WelcomePageCallback = function()
{
    logCallback();

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.CredentialsPageCallback = function()
{
    logCallback();

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function()
{
    logCallback();

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function()
{
    logCallback();

    var page = gui.currentPageWidget();
    page.deselectAll()
    if (installer.value("os") == "win") {
        selectComponent(page, "qt.58.win32_mingw53");
        selectComponent(page, "qt.tools.win32_mingw530");
    }
    else if (installer.value("os") == "x11") {
        selectComponent(page, "qt.58.gcc");
        selectComponent(page, "qt.58.gcc_64");
    }
    else if (installer.value("os") == "mac") {
        selectComponent(page, "qt.58.clang_64");
    }
    //selectComponent(page, "qt.58.qtquickcontrols");
    selectComponent(page, "qt.58.qtscript");

    gui.clickButton(buttons.NextButton);
}

function selectComponent(page, name)
{
    component = installer.componentByName(name);
    if (component) {
        console.log("component " + name + " : " + component);
        page.selectComponent(name);
    }
    else  {
        console.log("Failed to find component " + name + "!");
    }
}

Controller.prototype.LicenseAgreementPageCallback = function()
{
    logCallback();

    setChecked("AcceptLicenseRadioButton", true);

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function()
{
    logCallback();

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.PerformInstallationPageCallback = function()
{
    logCallback();

    // show details and hide button
    click("DetailsButton");
    setVisible("DetailsButton", false);

    // showing details will disable automated page switch, so re-enable it
    installer.setAutomatedPageSwitchEnabled(true);
}

Controller.prototype.FinishedPageCallback = function()
{
    logCallback();

    setChecked("launchQtCreatorCheckBox", false);

    gui.clickButton(buttons.FinishButton);
}

// utilities

function logCallback()
{
    var page = gui.currentPageWidget();
    console.log(">>> " + page.objectName + "Callback");
}

function dumpComponents()
{
    dumpComponentsArray(installer.components());
}

function dumpComponentsArray(components)
{
    var arrayLength = components.length;
    for (var i = 0; i < arrayLength; i++) {
        dumpComponent(components[i]);
    }
}

function dumpComponent(component)
{
    console.log(component.name + " (" + component.displayName + ")");
    console.log("  Virtual: " + component.value("Virtual", "false"));
    console.log("  ForcedInstallation: " + component.value("ForcedInstallation", "false"));
    console.log("  Default: " + component.default);
    console.log("  Enabled: " + component.enabled);
}

// UI utilities

function click(name)
{
    var page = gui.currentPageWidget();
    var button = gui.findChild(page, name);
    if (button) {
        console.log("button " + name + " : " + button);
        button.click();
    }
    else {
        console.log("Failed to find button " + name + "!");
    }
}

function setVisible(name, visible)
{
    var page = gui.currentPageWidget();
    var button = gui.findChild(page, name);
    if (button) {
        console.log("button " + name + " : " + button);
        button.visible = visible;
        console.log("button " + name + " visible : " + button.visible);
    }
    else {
        console.log("Failed to find button " + name + "!");
    }
}

function setEnabled(name, enabled)
{
    var page = gui.currentPageWidget();
    var button = gui.findChild(page, name);
    if (button) {
        console.log("button " + name + " : " + button);
        button.enabled = enabled;
        console.log("button " + name + " enabled : " + button.enabled);
    }
    else {
        console.log("Failed to find button " + name + "!");
    }
}

function setChecked(name, checked)
{
    var page = gui.currentPageWidget();
    var button = gui.findChild(page, name);
    if (button) {
        console.log("button " + name + " : " + button);
        button.checked = checked;
        console.log("button " + name + " checked : " + button.checked);
    }
    else {
        console.log("Failed to find button " + name + "!");
    }
}
