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

// 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 var            titles          : []
    property var            visibleItems    : []
    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]
    property bool           disable         : false

    /*!
     * \brief Emits when a menu item pressed
     * \param vIndex is the index of the pressed item
     */
    signal itemPressed(int vIndex)
    onItemPressed: {
        currentIndex = vIndex
        let itemAt = _repeater.itemAt(vIndex)
        if (itemAt)
            _highlightRect.x = itemAt.x
        else {
            _highlightRect.x = _rightTouchRect.x
        }
    }

    function isItemVisible      ( vIndex ) {
        return visibleItems     [ vIndex ] !== false // used "!== false" to cover undefined as true.
    }

    function emit_itemPressed   ( vIndex ) {
        if ( isItemVisible      ( vIndex ) )
            itemPressed         ( vIndex )
    }

    onCurrentIndexChanged: emit_itemPressed(currentIndex)

    /*!
     * 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 var     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
                animated    : false
                width       : partitionWidth
                height      : parent.height
                text.text   : isItemVisible(index) ? modelData : ""     // didn't change the visibility to preserve the button location and just didn't display the title and highlihgt bar.
                border.width: 0
                onPressed: {
                    emit_itemPressed(index)
                }
            }
        }
    }

    // the right outer most text with vertical line as a separator
    Line {
        visible: hasRightText && isItemVisible(_rightTouchRect.index)
        orientation: Line.Orientation.Vertical
        length: parent.height - rightTextGaps
        anchors.right: _rightTouchRect.left
        anchors.verticalCenter: parent.verticalCenter
    }
    TouchRect { id  : _rightTouchRect
        property int index: titles.length ? titles.length - 1  : -1
        animated    : false
        visible     : hasRightText
        width       : partitionWidth + rightTextGaps
        height      : parent.height
        text.text   : isItemVisible(index) ? _private.rightText : ""    // didn't change the visibility to preserve the button location and just didn't display the title and highlihgt bar.
        border.width: 0
        onPressed: {
            emit_itemPressed(index)
        }
        anchors.right: parent.right
        anchors.rightMargin: parent.rightPdding
        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: -(height / 2)
        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: {
        let isHidden = hidden || disable
        if ( position === MainMenu.Position.Top ) {
            y = isHidden ? - Variables.mainMenuHeight : 0
        } else {
            y = Variables.applicationHeight - (isHidden ? 0 : Variables.mainMenuHeight)
        }
    }
}
