import QtQuick 2.3
import QtQuick.Window 2.0
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.2

import "scripts/Utility.js" as Utility

Window {
    id: app
    title: Qt.application.name
    width: 400
    height: 200
    minimumWidth: 400
    minimumHeight: 200
    maximumWidth: 800
    maximumHeight: 400

    MessageDialog {
        id: confirmDialog
        title: app.title
        icon: StandardIcon.Question
        text: ""
        informativeText: ""
        detailedText: ""
        standardButtons: StandardButton.Ok | StandardButton.Cancel
        onAccepted: xdgUrlHandler.process()
        onRejected: Qt.quit()
    }

    MessageDialog {
        id: infoDialog
        title: app.title
        icon: StandardIcon.Information
        text: ""
        informativeText: ""
        detailedText: ""
        standardButtons: StandardButton.Open | StandardButton.Close
        onAccepted: {
            xdgUrlHandler.openDestination();
            Qt.quit();
        }
        onRejected: Qt.quit()
    }

    MessageDialog {
        id: errorDialog
        title: app.title
        icon: StandardIcon.Warning
        text: ""
        informativeText: ""
        detailedText: ""
        standardButtons: StandardButton.Close
        onRejected: Qt.quit()
    }

    Dialog {
        id: progressDialog
        title: app.title
        property alias primaryLabel: primaryLabel
        property alias informativeLabel: informativeLabel
        property alias progressBar: progressBar
        property alias progressLabel: progressLabel
        contentItem: Item {
            implicitWidth: 400
            implicitHeight: 150
            Column {
                anchors.fill: parent
                anchors.margins: 12
                spacing: 8
                Label {
                    id: primaryLabel
                    text: " "
                    font.bold: true
                }
                Label {
                    id: informativeLabel
                    text: " "
                }
                ProgressBar {
                    id: progressBar
                    maximumValue: 1
                    minimumValue: 0
                    value: 0
                    anchors.left: parent.left
                    anchors.right: parent.right
                }
                Label {
                    id: progressLabel
                    text: " "
                    anchors.right: parent.right
                }
                Button {
                    id: cancelButton
                    text: "Cancel"
                    anchors.right: parent.right
                    onClicked: Qt.quit()
                }
            }
        }
    }

    Component.onCompleted: {
        var metadata = xdgUrlHandler.metadata();
        var primaryMessages = {
            "success_download": "Download successfull",
            "success_install": "Installation successfull",
            "error_validation": "Validation error",
            "error_network": "Network error",
            "error_save": "Saving file failed",
            "error_install": "Installation failed"
        };

        xdgUrlHandler.started.connect(function() {
            progressDialog.open();
        });

        xdgUrlHandler.finishedWithSuccess.connect(function(result) {
            progressDialog.close();
            infoDialog.text = primaryMessages[result.status];
            infoDialog.informativeText = metadata.filename;
            infoDialog.detailedText = result.message;
            infoDialog.open();
        });

        xdgUrlHandler.finishedWithError.connect(function(result) {
            progressDialog.close();
            errorDialog.text = primaryMessages[result.status];
            errorDialog.informativeText = metadata.filename;
            errorDialog.detailedText = result.message;
            errorDialog.open();
        });

        xdgUrlHandler.downloadProgress.connect(function(id, bytesReceived, bytesTotal) {
            progressDialog.primaryLabel.text = "Downloading... ";
            progressDialog.informativeLabel.text = metadata.filename;
            progressDialog.progressBar.value = bytesReceived / bytesTotal;
            progressDialog.progressLabel.text = Utility.convertByteToHumanReadable(bytesReceived)
                    + " / " + Utility.convertByteToHumanReadable(bytesTotal)
        });

        if (xdgUrlHandler.isValid()) {
            confirmDialog.text = "Do you want to " + metadata.command + "?";
            confirmDialog.informativeText = metadata.filename;
            confirmDialog.detailedText = "URL: " + metadata.url + "\n\n"
                    + "File: " + metadata.filename + "\n\n"
                    + "Type: " + metadata.type;
            confirmDialog.open();
        }
        else {
            errorDialog.text = "Validation error";
            errorDialog.detailedText = "Invalid XDG-URL " + xdgUrlHandler.xdgUrl();
            errorDialog.open();
        }
    }
}