// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

import QtQuick
import HelperWidgets
import QtQuick.Layouts
import QtQuick.Controls as Controls

Column {
    anchors.left: parent.left
    anchors.right: parent.right

    Section {
        anchors.left: parent.left
        anchors.right: parent.right
        caption: qsTr("Surface")

        SectionLayout {
            PropertyLabel {
                text: qsTr("Flip Grid")
                tooltip: qsTr("Flip horizontal grid")
                Layout.fillWidth: true
            }
            SecondColumnLayout {
                CheckBox {
                    backendValue: backendValues.flipHorizontalGrid
                    Layout.fillWidth: true
                }
            }
            PropertyLabel {
                text: qsTr("Polar Coordinates")
                tooltip: qsTr("Use polar coordinates")
                Layout.fillWidth: true
            }
            SecondColumnLayout {
                CheckBox {
                    id: polarCheckbox
                    backendValue: backendValues.polar
                    Layout.fillWidth: true
                }
            }
            PropertyLabel {
                text: qsTr("Label Offset")
                tooltip: qsTr("Normalized horizontal radial label offset")
                Layout.fillWidth: true
                visible: polarCheckbox.checked
            }
            SecondColumnLayout {
                visible: polarCheckbox.checked
                SpinBox {
                    backendValue: backendValues.radialLabelOffset
                    minimumValue: 0.0
                    maximumValue: 1.0
                    stepSize: 0.01
                    decimals: 2
                    Layout.fillWidth: true
                }
            }
            PropertyLabel {
                text: qsTr("Selection Mode")
                tooltip: qsTr("Surface point selection mode")
                Layout.fillWidth: true
            }
            SecondColumnLayout {
                id: selectionLayout
                property bool isInModel: backendValue.isInModel;
                property bool isInSubState: backendValue.isInSubState;
                property bool selectionChangedFlag: selectionChanged
                property variant backendValue: backendValues.selectionMode
                property variant valueFromBackend: backendValue.value
                property string enumScope: "Graphs3D.SelectionFlag"
                property string enumSeparator: " | "
                property int checkedCount: 0
                property bool item: false
                property bool row: false
                property bool column: false
                property bool slice: false
                property bool multi: false

                function checkValue(checkedVariable, variableText, expressionBase) {
                    var expressionStr = expressionBase
                    if (checkedVariable) {
                        if (expressionStr !== "") {
                            expressionStr += enumSeparator
                        }
                        expressionStr += enumScope
                        expressionStr += "."
                        expressionStr += variableText
                        checkedCount++
                    }
                    return expressionStr
                }

                function composeSelectionMode() {
                    var expressionStr = ""
                    checkedCount = 0
                    expressionStr = checkValue(item, "Item", expressionStr)
                    expressionStr = checkValue(row, "Row", expressionStr)
                    expressionStr = checkValue(column, "Column", expressionStr)
                    expressionStr = checkValue(slice, "Slice", expressionStr)
                    expressionStr = checkValue(multi, "MultiSeries", expressionStr)

                    if (checkedCount === 0)
                        backendValue.expression = enumScope + ".None"
                    else
                        backendValue.expression = expressionStr
                }

                function evaluate() {
                    if (backendValue.value === undefined)
                        return

                    item = (backendValue.expression.indexOf("Item") !== -1)
                    row = (backendValue.expression.indexOf("Row") !== -1)
                    column = (backendValue.expression.indexOf("Column") !== -1)
                    slice = (backendValue.expression.indexOf("Slice") !== -1)
                    multi = (backendValue.expression.indexOf("MultiSeries") !== -1)

                    itemBox.checked = item
                    rowBox.checked = row
                    columnBox.checked = column
                    sliceBox.checked = slice
                    multiSeriesBox.checked = multi
                }

                onSelectionChangedFlagChanged: evaluate()

                onIsInModelChanged: evaluate()

                onIsInSubStateChanged: evaluate()

                onBackendValueChanged: evaluate()

                onValueFromBackendChanged: evaluate()

                ColumnLayout {
                    anchors.fill: parent

                    Controls.CheckBox {
                        id: itemBox
                        text: "Item"
                        Layout.fillWidth: true
                        onClicked: {
                            selectionLayout.item = checked
                            selectionLayout.composeSelectionMode()
                        }
                    }
                    Controls.CheckBox {
                        id: rowBox
                        text: "Row"
                        Layout.fillWidth: true
                        onClicked: {
                            selectionLayout.row = checked
                            selectionLayout.composeSelectionMode()
                        }
                    }
                    Controls.CheckBox {
                        id: columnBox
                        text: "Column"
                        Layout.fillWidth: true
                        onClicked: {
                            selectionLayout.column = checked
                            selectionLayout.composeSelectionMode()
                        }
                    }
                    Controls.CheckBox {
                        id: sliceBox
                        text: "Slice"
                        Layout.fillWidth: true
                        onClicked: {
                            selectionLayout.slice = checked
                            selectionLayout.composeSelectionMode()
                        }
                    }
                    Controls.CheckBox {
                        id: multiSeriesBox
                        text: "MultiSeries"
                        Layout.fillWidth: true
                        onClicked: {
                            selectionLayout.multi = checked
                            selectionLayout.composeSelectionMode()
                        }
                    }
                }
            }
        }
    }

    GraphsSection {}

    GraphsCameraSection {}
}
