/*!
 *
 * Copyright (c) 2025-2025 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    ValueAdjusterCustom.qml
 * \author  (last)      Nico Ramirez
 * \date    (last)      20-Nov-2025
 * \author  (original)  Nico Ramirez
 * \date    (original)  20-Nov-2025
 *
 */

import "qrc:/globals"
import "qrc:/components"

// Qt
import QtQuick 2.12
import QtQuick.Controls 2.12

Item { id: _root
    property var model                  : []
    property int currentIndex           : 0
    property int length                 : model.length === 0 ? 0 : model.length
    readonly property bool canIncrement : isActive ? _root.currentIndex < _root.length - 1 : true
    readonly property bool canDecrement : isActive ? _root.currentIndex > 0 : true
    property bool           grabbed     : false
    property bool          canOff       : false
    property bool           editable    : true
    property bool           isActive    : true
    property bool           canRefresh  : false
    property int         defaultValue   : 0
    property int         value          : 0

    signal didChange        (real vValue)
    signal didActiveChange  (bool vState)

    onValueChanged      : currentIndex = value

    onIsActiveChanged   : {
        if ( canRefresh )   { canRefresh = false; return    }

        if ( isActive )     { didChange(_root.defaultValue) }
    }

    function refresh()      { canRefresh    = true          }

    function clear()        { didActiveChange(false)        }

    Text { id: _currentItem
        anchors.centerIn    : parent
        text                : _root.model[_root.currentIndex] !== undefined ?
                                  _root.isActive ? _root.canOff ? _root.currentIndex === 0 ? qsTr("OFF") : _root.model[_root.currentIndex] :
                                        _root.model[_root.currentIndex] : Variables.emptyEntry : ""
        color               : Colors.offWhite
        font.pixelSize      : Fonts.fontPixelValueControl
    }

    Slider { id: _slider
        property real pos           : 0

        anchors.fill        : parent
        anchors.rightMargin : Variables.defaultMargin * 3
        anchors.leftMargin  : Variables.defaultMargin * 2
        anchors.topMargin   : 5
        opacity             : 0
        stepSize            : 1
        from                : 0
        to                  : _root.length - 1
        value               : _root.currentIndex
        snapMode            : Slider.SnapOnRelease
        enabled             : _root.editable

        background: Rectangle {
            color: "transparent"
            Rectangle {
                anchors{
                    top         : parent.top
                    topMargin   : 1.5
                    left        : parent.left
                    right       : parent.right
                    rightMargin : Variables.defaultMargin * -1
                }
                height  : 1
                width   : parent.width
                color   : Colors.panelBorderColor
            }
        }

        handle: Rectangle { id: _knob
            width   : 20
            height  : 4
            radius  : height
            color   : Colors.borderButton
            x       : _slider.pos * _slider.width
        }

        MouseArea { id: _sliderMouseArea
            anchors.fill        : parent
            pressAndHoldInterval: 0
            drag.axis           : Drag.XAxis      // only horizontal

            onClicked: {
                if ( _root.editable ) { didActiveChange(true); focus = true }

                _slider.opacity = 0
            }

            onReleased: {
                _root.grabbed = false
                _slider.opacity = 0
            }

            onPressAndHold: {
                if ( _root.editable ) { didActiveChange(true); focus = true }

                _root.grabbed = true
            }

            onPositionChanged: {
                if (_root.grabbed) {
                    if ( _slider.opacity === 0 ) { _animator.start() }

                    _slider.pos = Math.max(0, Math.min(1, mouse.x / parent.width))
                    let raw =  _slider.from + _slider.pos * (_slider.to - _slider.from)
                    let stepped = Math.round((raw - _slider.from) / _slider.stepSize) * _slider.stepSize + _slider.from
                    _root.currentIndex = stepped
                    didChange(stepped)
                }
            }

            onExited: {
                if ( ! _root.grabbed ) {
                    _animator.stop()
                    _slider.opacity = 0
                }
            }
        }

        OpacityAnimator { id: _animator
            target  : _slider
            from    : 0
            to      : 1
            duration: 350
            running : _root.grabbed
        }

        Behavior on opacity { NumberAnimation { duration: 200 } }
    }

    IconButton { id: _leftArrow
        anchors {
            verticalCenter  : _root.verticalCenter
            left            : _root.left
            leftMargin      : Variables.defaultMargin
        }
        iconSize                : Variables.circleButtonDefaultDiameter
        enabled                 : _root.canDecrement
        visible                 : _root.editable
        iconImageSource         : enabled ? "qrc:/images/iArrowLeft" :
                                            "qrc:/images/iArrowLeftDisabled"
        onClicked               : {
            if ( ! isActive ) { didActiveChange(true); return }
            didChange(_root.currentIndex -= 1)
        }
    }

    IconButton { id: _rightArrow
        anchors {
            verticalCenter  : _root.verticalCenter
            right           : _root.right
            rightMargin     : Variables.defaultMargin
        }
        iconSize                : Variables.circleButtonDefaultDiameter
        enabled                 : _root.canIncrement
        visible                 : _root.editable
        iconImageSource         : enabled ? "qrc:/images/iArrowRight" :
                                            "qrc:/images/iArrowRightDisabled"
        onClicked               : {
            if ( ! isActive ) { didActiveChange(true); return }
            didChange(_root.currentIndex += 1)
        }
    }
}
