// Copyright (c) 2020 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.

import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2

import UM 1.5 as UM
import Cura 1.1 as Cura

UM.Dialog
{
    id: base
    title: catalog.i18nc("@title:window", "Open Project")

    minimumWidth: UM.Theme.getSize("popup_dialog").width
    minimumHeight: UM.Theme.getSize("popup_dialog").height
    width: minimumWidth
    
    property int comboboxHeight: UM.Theme.getSize("default_margin").height

    onClosing: manager.notifyClosed()
    onVisibleChanged:
    {
        if (visible)
        {
            machineResolveComboBox.currentIndex = 0
            qualityChangesResolveComboBox.currentIndex = 0
            materialResolveComboBox.currentIndex = 0
        }
    }

    Item
    {
        id: dialogSummaryItem
        width: parent.width
        height: childrenRect.height
        anchors.margins: 10 * screenScaleFactor

        UM.I18nCatalog
        {
            id: catalog
            name: "cura"
        }

        ListModel
        {
            id: resolveStrategiesModel
            // Instead of directly adding the list elements, we add them afterwards.
            // This is because it's impossible to use setting function results to be bound to listElement properties directly.
            // See http://stackoverflow.com/questions/7659442/listelement-fields-as-properties
            Component.onCompleted:
            {
                append({"key": "override", "label": catalog.i18nc("@action:ComboBox Update/override existing profile", "Update existing")});
                append({"key": "new", "label": catalog.i18nc("@action:ComboBox Save settings in a new profile", "Create new")});
            }
        }

        Column
        {
            width: parent.width
            height: childrenRect.height
            spacing: UM.Theme.getSize("default_margin").height

            Column
            {
                width: parent.width
                height: childrenRect.height

                UM.Label
                {
                    id: titleLabel
                    text: catalog.i18nc("@action:title", "Summary - Cura Project")
                    font: UM.Theme.getFont("large")
                }

                Rectangle
                {
                    id: separator
                    color: UM.Theme.getColor("text")
                    width: parent.width
                    height: UM.Theme.getSize("default_lining").height
                }
            }

            Item
            {
                width: parent.width
                height: childrenRect.height

                UM.TooltipArea
                {
                    id: machineResolveStrategyTooltip
                    anchors.top: parent.top
                    anchors.right: parent.right
                    width: (parent.width / 3) | 0
                    height: visible ? comboboxHeight : 0
                    visible: base.visible && machineResolveComboBox.model.count > 1
                    text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?")
                    Cura.ComboBox
                    {
                        id: machineResolveComboBox
                        model: manager.updatableMachinesModel
                        visible: machineResolveStrategyTooltip.visible
                        textRole: "displayName"
                        width: parent.width
                        height: UM.Theme.getSize("button").height
                        onCurrentIndexChanged:
                        {
                            if (model.getItem(currentIndex).id == "new"
                                && model.getItem(currentIndex).type == "default_option")
                            {
                                manager.setResolveStrategy("machine", "new")
                            }
                            else
                            {
                                manager.setResolveStrategy("machine", "override")
                                manager.setMachineToOverride(model.getItem(currentIndex).id)
                            }
                        }

                        onVisibleChanged:
                        {
                            if (!visible) {return}

                            currentIndex = 0
                            // If the project printer exists in Cura, set it as the default dropdown menu option.
                            // No need to check object 0, which is the "Create new" option
                            for (var i = 1; i < model.count; i++)
                            {
                                if (model.getItem(i).name == manager.machineName)
                                {
                                    currentIndex = i
                                    break
                                }
                            }
                            // The project printer does not exist in Cura. If there is at least one printer of the same
                            // type, select the first one, else set the index to "Create new"
                            if (currentIndex == 0 && model.count > 1)
                            {
                                currentIndex = 1
                            }
                        }
                    }
                }

                Column
                {
                    width: parent.width
                    height: childrenRect.height

                    UM.Label
                    {
                        id: printer_settings_label
                        text: catalog.i18nc("@action:label", "Printer settings")
                        font: UM.Theme.getFont("default_bold")
                    }

                    Row
                    {
                        width: parent.width
                        height: childrenRect.height

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", "Type")
                            width: (parent.width / 3) | 0
                        }
                        UM.Label
                        {
                            text: manager.machineType
                            width: (parent.width / 3) | 0
                        }
                    }

                    Row
                    {
                        width: parent.width
                        height: childrenRect.height

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", manager.isPrinterGroup ? "Printer Group" : "Printer Name")
                            width: (parent.width / 3) | 0
                        }
                        UM.Label
                        {
                            text: manager.machineName
                            width: (parent.width / 3) | 0
                            wrapMode: Text.WordWrap
                        }
                    }
                }
            }

            Item
            {
                width: parent.width
                height: childrenRect.height

                UM.TooltipArea
                {
                    anchors.right: parent.right
                    anchors.top: parent.top
                    width: (parent.width / 3) | 0
                    height: visible ? comboboxHeight : 0
                    visible: manager.qualityChangesConflict
                    text: catalog.i18nc("@info:tooltip", "How should the conflict in the profile be resolved?")
                    Cura.ComboBox
                    {
                        model: resolveStrategiesModel
                        textRole: "label"
                        id: qualityChangesResolveComboBox
                        width: parent.width
                        height: UM.Theme.getSize("button").height
                        onActivated:
                        {
                            manager.setResolveStrategy("quality_changes", resolveStrategiesModel.get(index).key)
                        }
                    }
                }

                Column
                {
                    width: parent.width
                    height: childrenRect.height

                    UM.Label
                    {
                        text: catalog.i18nc("@action:label", "Profile settings")
                        font: UM.Theme.getFont("default_bold")
                    }

                    Row
                    {
                        width: parent.width
                        height: childrenRect.height

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", "Name")
                            width: (parent.width / 3) | 0
                        }
                        UM.Label
                        {
                            text: manager.qualityName
                            width: (parent.width / 3) | 0
                            wrapMode: Text.WordWrap
                        }
                    }

                    Row
                    {
                        width: parent.width
                        height: childrenRect.height

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", "Intent")
                            width: (parent.width / 3) | 0
                        }
                        UM.Label
                        {
                            text: manager.intentName
                            width: (parent.width / 3) | 0
                            wrapMode: Text.WordWrap
                        }
                    }

                    Row
                    {
                        width: parent.width
                        height: childrenRect.height

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", "Not in profile")
                            visible: manager.numUserSettings != 0
                            width: (parent.width / 3) | 0
                        }
                        UM.Label
                        {
                            text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
                            visible: manager.numUserSettings != 0
                            width: (parent.width / 3) | 0
                        }
                    }

                    Row
                    {
                        width: parent.width
                        height: childrenRect.height

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", "Derivative from")
                            visible: manager.numSettingsOverridenByQualityChanges != 0
                            width: (parent.width / 3) | 0
                        }
                        UM.Label
                        {
                            text: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
                            width: (parent.width / 3) | 0
                            visible: manager.numSettingsOverridenByQualityChanges != 0
                            wrapMode: Text.WordWrap
                        }
                    }
                }
            }

            Item
            {
                width: parent.width
                height: childrenRect.height

                UM.TooltipArea
                {
                    id: materialResolveTooltip
                    anchors.right: parent.right
                    anchors.top: parent.top
                    width: (parent.width / 3) | 0
                    height: visible ? comboboxHeight : 0
                    visible: manager.materialConflict
                    text: catalog.i18nc("@info:tooltip", "How should the conflict in the material be resolved?")
                    Cura.ComboBox
                    {
                        model: resolveStrategiesModel
                        textRole: "label"
                        id: materialResolveComboBox
                        width: parent.width
                        height: UM.Theme.getSize("button").height
                        onActivated:
                        {
                            manager.setResolveStrategy("material", resolveStrategiesModel.get(index).key)
                        }
                    }
                }

                Column
                {
                    width: parent.width
                    height: childrenRect.height
                    Row
                    {
                        height: childrenRect.height
                        width: parent.width
                        spacing: UM.Theme.getSize("narrow_margin").width

                        UM.Label
                        {
                            text: catalog.i18nc("@action:label", "Material settings")
                            font: UM.Theme.getFont("default_bold")
                            width: (parent.width / 3) | 0
                        }
                    }

                    Repeater
                    {
                        model: manager.materialLabels
                        delegate: Row
                        {
                            width: parent.width
                            height: childrenRect.height
                            UM.Label
                            {
                                text: catalog.i18nc("@action:label", "Name")
                                width: (parent.width / 3) | 0
                            }
                            UM.Label
                            {
                                text: modelData
                                width: (parent.width / 3) | 0
                                wrapMode: Text.WordWrap
                            }
                        }
                    }
                }
            }

            Column
            {
                width: parent.width
                height: childrenRect.height

                UM.Label
                {
                    text: catalog.i18nc("@action:label", "Setting visibility")
                    font: UM.Theme.getFont("default_bold")
                }
                Row
                {
                    width: parent.width
                    height: childrenRect.height
                    UM.Label
                    {
                        text: catalog.i18nc("@action:label", "Mode")
                        width: (parent.width / 3) | 0
                    }
                    UM.Label
                    {
                        text: manager.activeMode
                        width: (parent.width / 3) | 0
                    }
                }
                Row
                {
                    width: parent.width
                    height: childrenRect.height
                    visible: manager.hasVisibleSettingsField
                    UM.Label
                    {
                        text: catalog.i18nc("@action:label", "Visible settings:")
                        width: (parent.width / 3) | 0
                    }
                    UM.Label
                    {
                        text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings)
                        width: (parent.width / 3) | 0
                    }
                }
            }

            Row
            {
                width: parent.width
                height: childrenRect.height
                visible: manager.hasObjectsOnPlate
                UM.ColorImage
                {
                    width: warningLabel.height
                    height: width
                    source: UM.Theme.getIcon("Information")
                    color: UM.Theme.getColor("text")
                }
                UM.Label
                {
                    id: warningLabel
                    text: catalog.i18nc("@action:warning", "Loading a project will clear all models on the build plate.")
                }
            }
        }
    }

    buttonSpacing: UM.Theme.getSize("default_margin").width

    rightButtons: [
        Cura.TertiaryButton
        {
            text: catalog.i18nc("@action:button", "Cancel")
            onClicked: reject()
        },
        Cura.PrimaryButton
        {
            text: catalog.i18nc("@action:button", "Open")
            onClicked: accept()
        }
    ]

    onRejected: manager.onCancelButtonClicked()
    onAccepted: manager.onOkButtonClicked()
}