/*!
 *
 * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved.
 * \copyright                                                       \n
 *          THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM,  \n
 *          IN PART OR IN WHOLE,                                    \n
 *          WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. \n
 *
 * \file    MainMenu.qml
 * \date    2019/10/18
 * \author  Behrouz NematiPour
 *
 */

// Qt
import QtQuick 2.12

// Project
//  Qml imports
import "qrc:/globals"

/*!
 * \brief   The MainMenu Component
 * which contains three [Treatment, Manager, Settings]
 */
Item { id: _root
    enum Position {
        Top,
        Bottom
    }

    property variant    titles          : []
    property bool       hidden          : false
    property int        position        : MainMenu.Position.Bottom
    property bool       hasRightText    : false
    property int        rightTextGaps   : 20
    property bool       hasLogo         : false
    property int        currentIndex    : 0
    property string     currentTitle    : titles[currentIndex]

    /*!
     * \brief Emits when a menu item pressed
     * \param vIndex is the index of the pressed item
     */
    signal itemPressed(int vIndex)
    onItemPressed: {
        currentIndex = vIndex
    }

    /*!
     * this section olds somkind of the private sections of the object
     * this section is used as the calculation section whcih soppose not to be changed by user.
     */
    QtObject { id: _private
        readonly property variant repeaterTitles: hasRightText ? titles.slice(0,titles.length - 1) : titles
        readonly property string  rightText     : titles.length ? titles[titles.length - 1] : ""
        readonly property int     partitionWidth: _row.width / ( _private.repeaterTitles.length * 2 + 1)
    }

    /*! type:int
     * this property holds the width of each partition
     * regarding to the menuitem count and menu width
     */
    property int    partitionWidth  : _private.partitionWidth
    property alias  spacing         : _row.spacing
    property alias  leftPdding      : _row.leftPadding
    property alias  rightPdding     : _row.rightPadding


    clip: true
    x: 0
    y: Variables.applicationHeight - Variables.mainMenuHeight
    width: parent.width
    height: Variables.mainMenuHeight

    Rectangle { id: _backgroundRect
        anchors.fill: parent
        color: Colors.backgroundMainMenu
    }
    MouseArea { id: _clickPropagationDisabler
        anchors.fill: parent
    }

    ImageLogoDDT { id: _image
        visible: hasLogo
        anchors.centerIn: parent
    }

    // normal texts with highlighter bottom ribon.
    Row { id: _row
        anchors.fill: parent
        spacing     : partitionWidth
        leftPadding : partitionWidth
        rightPadding: partitionWidth

        Repeater { id: _repeater
            model: _private.repeaterTitles
            TouchRect { id : _touchRect
                objectName: "_touchRect" + index //SquishQt testability
                width: partitionWidth
                height: parent.height
                text.text: modelData
                border.width: 0
                button.onPressed: {
                    _highlightRect.x = _touchRect.x
                    itemPressed(index)
                }
            }
        }
    }

    // the right outer most text with vertical line as a separator
    Line {
        visible: hasRightText
        orientation: Line.Orientation.Vertical
        length: parent.height - rightTextGaps
        anchors.right: _rightTouchRect.left
        anchors.verticalCenter: parent.verticalCenter
    }
    TouchRect { id : _rightTouchRect
        visible: hasRightText
        width: partitionWidth + rightTextGaps
        height: parent.height
        text.text: _private.rightText
        border.width: 0
        button.onPressed: {
            itemPressed( titles.length ? titles.length - 1  : -1 )
        }
        anchors.right: parent.right
        anchors.verticalCenter: parent.verticalCenter
    }

    // normal text bottom highlighter
    Rectangle { id : _highlightRect
        color: Colors.backgroundButtonSelect
        width: partitionWidth
        x    : leftPdding
        height: 10
        radius: 10
        anchors.bottom: parent.bottom
        anchors.bottomMargin: -5
        Behavior on x { PropertyAnimation { /*duration: 500; easing.type: Easing.OutBounce*/ } }
    }

    // hidden animation to hide the menu nicely.
    Behavior on y { PropertyAnimation { /*duration: 500; easing.type: Easing.OutBounce*/ } }
    onHiddenChanged: {
        if ( position === MainMenu.Position.Top ) {
            y = hidden ? - Variables.mainMenuHeight : 0
        } else {
            y = Variables.applicationHeight - (hidden ? 0 : Variables.mainMenuHeight)
        }
    }
}
