// Copyright (c) 2014-2018, The Monero Project
// 
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
// 
// 1. Redistributions of source code must retain the above copyright notice, this list of
//    conditions and the following disclaimer.
// 
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
//    of conditions and the following disclaimer in the documentation and/or other
//    materials provided with the distribution.
// 
// 3. Neither the name of the copyright holder nor the names of its contributors may be
//    used to endorse or promote products derived from this software without specific
//    prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import QtQuick 2.5
import QtQuick.Window 2.0
import QtQuick.Layouts 1.1

Rectangle {
    id: titleBar

    height: {
        if(!customDecorations || isMobile){
            return 0;
        }

        if(small) return 38 * scaleRatio;
        else return 50 * scaleRatio;
    }
    y: -height
    z: 1

    property string title
    property int mouseX: 0
    property bool containsMouse: false
    property bool basicButtonVisible: false
    property bool customDecorations: persistentSettings.customDecorations
    property bool showWhatIsButton: true
    property bool showMinimizeButton: false
    property bool showMaximizeButton: false
    property bool showCloseButton: true
    property bool showMoneroLogo: false
    property bool small: false
    property alias titleBarGradientImageOpacity: titleBarGradientImage.opacity
    property bool orange: false
    property string buttonHoverColor: "#262626"
    property string buttonHoverColorOrange: "#44FFFFFF"

    signal closeClicked
    signal maximizeClicked
    signal minimizeClicked
    signal goToBasicVersion(bool yes)

    Item {
        // Background gradient
        width: parent.width
        height: parent.height
        z: parent.z + 1

        Image {
           id: titleBarGradientImage
           visible: !titleBar.orange
           anchors.fill: parent
           height: titleBar.height
           width: titleBar.width
           source: "../images/titlebarGradient.jpg"
        }

        Rectangle {
            visible: titleBar.orange
            width: parent.width
            height: parent.height
            color: "#ff6600"
        }
    }

    Item {
        id: titlebarlogo
        width: 125
        height: parent.height
        anchors.centerIn: parent
        visible: customDecorations
        z: parent.z + 1

        Image {
            visible: !isMobile && showMoneroLogo && !titleBar.orange
            anchors.left: parent.left
            anchors.top: parent.top
            anchors.topMargin: 11
            width: 125
            height: 28
            source: "../images/titlebarLogo.png"
        }

        Image {
            visible: !isMobile && showMoneroLogo && titleBar.orange
            anchors.left: parent.left
            anchors.top: parent.top
            anchors.topMargin: 11
            width: 132
            height: 22
            source: "../images/moneroLogo_white.png"
        }
    }

    Label {
        id: titleLabel
        visible: !showMoneroLogo && customDecorations && titleBar.title !== ''
        anchors.centerIn: parent
        fontSize: 18
        text: titleBar.title
        z: parent.z + 1
    }

    RowLayout {
        anchors.left: parent.left
        anchors.top: parent.top
        width: 40
        height: parent.height
        spacing: 0
        z: parent.z + 2

        Rectangle {
            Layout.preferredHeight: parent.height
            Layout.preferredWidth: Layout.preferredHeight

            id: goToBasicVersionButton
            property bool containsMouse: titleBar.mouseX >= x && titleBar.mouseX <= x + width
            property bool checked: false
            color:  "transparent"
            height: titleBar.height
            width: height
            visible: !titleBar.orange && titleBar.basicButtonVisible

            Image {
                width: 14
                height: 14
                anchors.centerIn: parent
                source: "../images/expand.png"
            }

            MouseArea {
                id: basicMouseArea
                hoverEnabled: true
                anchors.fill: parent
                cursorShape: Qt.PointingHandCursor
                onEntered: { goToBasicVersionButton.color = titleBar.orange ? titleBar.buttonHoverColorOrange : titleBar.buttonHoverColor }
                onExited: goToBasicVersionButton.color = "transparent";
                onClicked: {
                    releaseFocus()
                    parent.checked = !parent.checked
                    titleBar.goToBasicVersion(leftPanel.visible)
                }
            }
        }

        // language selection
        Rectangle {
            Layout.preferredHeight: parent.height
            Layout.preferredWidth: Layout.preferredHeight
            visible: !titleBar.orange && persistentSettings.customDecorations

            id: languageSelection
            property bool containsMouse: titleBar.mouseX >= x && titleBar.mouseX <= x + width
            property bool checked: false
            color:  "transparent"
            height: titleBar.height
            width: height
            z: parent.z + 2

            Image {
                width: 14
                height: 14
                anchors.centerIn: parent
                source: "../images/langFlagGrey.png"
            }

            MouseArea {
                hoverEnabled: true
                anchors.fill: parent
                cursorShape: Qt.PointingHandCursor
                onEntered: parent.color = "#262626";
                onExited: parent.color = "transparent";
                onClicked: {
                    releaseFocus();

                    // Show welcome screen if on home
                    if(wizard.wizardState === "wizardHome" || wizard.wizardState === "wizardModeSelection"){
                        wizard.skipModeSelection = true;
                        wizard.wizardState = 'wizardLanguage';
                        return;
                    }

                    languageSidebar.isOpened ? languageSidebar.close() : languageSidebar.open();
                    console.log('change language');
                }
            }
        }
    }

    Row {
        id: row
        anchors.right: parent.right
        anchors.top: parent.top
        anchors.bottom: parent.bottom
        visible: parent.customDecorations
        z: parent.z + 2

        Rectangle {
            id: minimizeButton
            visible: showMinimizeButton
            anchors.top: parent.top
            anchors.bottom: parent.bottom
            width: 42
            color: "transparent"

            Image {
                anchors.centerIn: parent
                source: "../images/minimize.png"
            }

            MouseArea {
                id: minimizeArea
                anchors.fill: parent
                hoverEnabled: true
                cursorShape: Qt.PointingHandCursor
                onEntered: {
                    if(titleBar.orange){
                        minimizeButton.color = titleBar.buttonHoverColorOrange;
                    } else {
                        minimizeButton.color = titleBar.buttonHoverColor;
                    }
                }
                onExited: minimizeButton.color = "transparent";
                onClicked: minimizeClicked();
            }
        }

        Rectangle {
            id: maximizeButton
            visible: showMaximizeButton
            anchors.top: parent.top
            anchors.bottom: parent.bottom
            width: 42
            color: "transparent";

            Image {
                anchors.centerIn: parent
                height: 16
                width: 16
                source: appWindow.visibility === Window.FullScreen ?  "../images/backToWindowIcon.png" :
                                                                      "../images/fullscreen.png"
            }

            MouseArea {
                id: maximizeArea
                anchors.fill: parent
                hoverEnabled: true
                cursorShape: Qt.PointingHandCursor
                onEntered: {
                    if(titleBar.orange){
                        maximizeButton.color = titleBar.buttonHoverColorOrange;
                    } else {
                        maximizeButton.color = titleBar.buttonHoverColor;
                    }
                }
                onExited: maximizeButton.color = "transparent";
                onClicked: maximizeClicked();
            }
        }

        Rectangle {
            id: closeButton
            visible: showCloseButton
            anchors.top: parent.top
            anchors.bottom: parent.bottom
            width: 42
            color: containsMouse ? "#E04343" : "#00000000"

            Image {
                anchors.centerIn: parent
                width: 16
                height: 16
                source: "../images/close.png"
            }

            MouseArea {
                anchors.fill: parent
                onClicked: closeClicked();
                hoverEnabled: true
                cursorShape: Qt.PointingHandCursor
                onEntered: {
                    if(titleBar.orange){
                        closeButton.color = titleBar.buttonHoverColorOrange;
                    } else {
                        closeButton.color = titleBar.buttonHoverColor;
                    }
                }
                onExited: closeButton.color = "transparent";
            }
        }
    }

    // window borders
    Rectangle {
        visible: !titleBar.orange
        anchors.bottom: parent.bottom
        anchors.right: parent.right
        anchors.left: parent.left
        height: 1
        color: "#2F2F2F"
        z: parent.z + 1
    }

    Rectangle {
        visible: titleBar.small && !titleBar.orange
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.left: parent.left
        height: 1
        color: "#2F2F2F"
        z: parent.z + 1
    }
}
