import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import QtQuick.Scene3D 2.14
import Qt3D.Core 2.14
import Qt3D.Render 2.14
import Qt3D.Input 2.14
import Qt3D.Extras 2.14

import QtQuick 2.14 as QQ2
import QtQuick.Dialogs 1.3
import QtQuick.Window 2.2
import QtQuick.Controls 2.5

Pandar_root {
    Connections {
        target: selectArea
        onSelectEnabledChanged: {
            modelData.selectEnabled = selectArea.selectEnabled   
        }
    }
    Connections {
        target: selectArea
        onSelectionChanged: {
            modelData.selectionMatrix = selectionMatrix
        }
    }
    
    DefaultMaterial {
        id: pointxyziMaterial
    }

    DefaultMaterialSplit {
        id: pointxyziMaterialSplit
    }

    DefaultGeometryRenderer {
        id: pointxyziGeometry
    }
    DefaultGeometryRenderer {
        id: pointxyziGeometrySplit
    }

    Transform {
        id: pointxyziTransform
    }
    Transform {
        id: pointxyziTransformSplit
    }

    DefaultObjectPicker {
        id: pointxyziPicker
    }

    MouseHandler {
        id: pointxyziMouseHandler
        sourceDevice: mouseDevice
        onWheel: {}
    }
    components: modelData.splitWindow ? [pointxyziMaterial, pointxyziGeometry, pointxyziTransform, pointxyziPicker, pointxyziMouseHandler,layer2] : [pointxyziMaterial, pointxyziGeometry, pointxyziTransform, pointxyziPicker, pointxyziMouseHandler]
    
    Entity {
       components: modelData.splitWindow ? [pointxyziMaterialSplit, pointxyziGeometrySplit, pointxyziTransformSplit,layer1] : [] 
    }

    EntityLoader {
        id: lineEntityLoader
        property var begin: Qt.vector3d(0, 0, 0)
        property var end: Qt.vector3d(0, 0, 0)
    }

    EntityLoader {
        id: lasersEntityLoader
        source: ""
    }

    FileDialog {
        id: fileDialog
        property int mode: 0
        title: "Please choose import file"
        // folder: Qt.resolvedUrl("../csv/")
        nameFilters: ["CSV files (*.csv)"]
        onAccepted: {
            switch (mode) {
                case 1:
                    if(modelData.importCorrectionsFile(fileDialog.fileUrl)) {
                        console.log("Succeed to import: " + fileDialog.fileUrl)
                        var src = config.url2string(fileDialog.fileUrl)
                        var filename = src.split('/').pop()
                        var dst = config.getDocuments()+"/PandarViewDataFiles/csv/corrections/"+filename;
                        if (src != dst) {
                            if(config.exists(dst))
                                config.remove(dst)
                            if(config.copy(src, dst)) {
                                correctionComboBox.refresh()
                                for (var i in correctionComboBox.data_list) {
                                    if (correctionComboBox.data_list[i].text == filename) {
                                        correctionComboBox.currentIndex = i
                                        break
                                    }
                                }
                                console.log("correctionComboBox.currentText:" + correctionComboBox.currentText)
                            }
                            else
                                controlPanel.messageDialogOpen("Unable to copy from: " + src + " to: " + dst)
                        }
                        else {
                            for (var i in correctionComboBox.data_list) {
                                if (correctionComboBox.data_list[i].text == filename) {
                                    correctionComboBox.currentIndex = i
                                    break
                                }
                            }
                            console.log("correctionComboBox.currentText:" + correctionComboBox.currentText)
                        }
                    } else {
                        console.log("Unable to import: " + fileDialog.fileUrl)
                        controlPanel.messageDialogOpen("Unable to import: \n" + fileDialog.fileUrl)
                    }
                    break;
                case 2:
                    if(modelData.exportCorrectionsFile(fileDialog.fileUrl)) {
                        console.log("Succeed to export: " + fileDialog.fileUrl)
                    } else {
                        console.log("Unable to export: " + fileDialog.fileUrl)
                        controlPanel.messageDialogOpen("Unable to export: \n" + fileDialog.fileUrl)
                    }
                    break;
                case 3:
                    if(modelData.importFiretimesFile(fileDialog.fileUrl)) {
                        console.log("Succeed to import: " + fileDialog.fileUrl)
                        var src = config.url2string(fileDialog.fileUrl)
                        var filename = src.split('/').pop()
                        var dst = config.getDocuments()+"/PandarViewDataFiles/csv/firetimes/"+filename;
                        if (src != dst) {
                            if(config.exists(dst))
                                config.remove(dst)
                            if(config.copy(src, dst)) {
                                firetimeComboBox.refresh()
                                for (var i in firetimeComboBox.data_list) {
                                    if (firetimeComboBox.data_list[i].text == filename) {
                                        firetimeComboBox.currentIndex = i
                                        break
                                    }
                                }
                                console.log("firetimeComboBox.currentText:" + firetimeComboBox.currentText)
                            }
                            else
                                controlPanel.messageDialogOpen("Unable to copy from: " + src + " to: " + dst)
                        }
                        else {
                            for (var i in firetimeComboBox.data_list) {
                                if (firetimeComboBox.data_list[i].text == filename) {
                                    firetimeComboBox.currentIndex = i
                                    break
                                }
                            }
                            console.log("firetimeComboBox.currentText:" + firetimeComboBox.currentText)
                        }
                    } else {
                        console.log("Unable to import: " + fileDialog.fileUrl)
                        controlPanel.messageDialogOpen("Unable to import: \n" + fileDialog.fileUrl)
                    }
                    break;
                case 4:
                    if(modelData.exportFiretimesFile(fileDialog.fileUrl)) {
                        console.log("Succeed to export: " + fileDialog.fileUrl)
                    } else {
                        console.log("Unable to export: " + fileDialog.fileUrl)
                        controlPanel.messageDialogOpen("Unable to export: \n" + fileDialog.fileUrl)
                    }
                    break;
                default:
                    break;
            }
                
        }
    }

    RowLayout {
        parent: leftBottomControlPanel
        spacing: 1
        BottomToolButton {
            id: playByFrameButton 
            checkable: true
            icon.source: 'file:png/frame.png'
            highlighted: bottomPanel.playByFrame = modelData.playByFrame
            onClicked: {
                highlighted = bottomPanel.playByFrame = modelData.playByFrame = true
            }
            Action {
                shortcut: "Ctrl+Q"
                onTriggered: playByFrameButton.onClicked()
            }
            ToolTip {
                visible: parent.hovered
                delay: 500
                text: qsTr("Play by Frame (Ctrl+Q)")
            }
        }
        BottomToolButton {
            id: playByTimeButton
            checkable: true
            icon.source: 'file:png/time.png'
            highlighted: !playByFrameButton.highlighted
            onClicked: {
                playByFrameButton.highlighted = bottomPanel.playByFrame = modelData.playByFrame = false
            }
            Action {
                shortcut: "Ctrl+W"
                onTriggered: playByTimeButton.onClicked()
            }
            ToolTip {
                visible: parent.hovered
                delay: 500
                text: qsTr("Play by Time (Ctrl+W)")
            }
        }
        Rectangle {
            width: 18
            height: 36
            color: "transparent"
        }
    }

    RowLayout {
        parent: yellowToolBar
        Rectangle {
            implicitWidth: 48
            implicitHeight: 42
            color: "transparent"
            DefaultToolButton {
                id: correctionButton
                icon.source: 'file:png/corrections.png'
                highlighted: correctionsPanel.visible
                onClicked: correctionsPanel.visible = !correctionsPanel.visible
                onDoubleClicked: onClicked()
                Action {
                    shortcut: "Ctrl+C"
                    onTriggered: correctionButton.onClicked()
                }
                ToolTip {
                    visible: parent.hovered
                    delay: 500
                    text: qsTr("Correction (Ctrl+C)")
                }
            }
            Rectangle {
                id: correctionsPanel
                visible: false
                anchors.top: parent.bottom
                color: activePalette.window
                height: fileToolButtons.height
                width: fileToolButtons.width + 40
                ColumnLayout {
                    id: fileToolButtons
                    x: 20
                    spacing: 10
                    Rectangle {
                        height: 10
                    }
                    Label {
                        text: "Angle Correction"
                        color: activePalette.text
                    }
                    DefaultComboBox {
                        implicitHeight: 36
                        implicitWidth: 240
                        focusPolicy: Qt.NoFocus
                        id: correctionComboBox
                        property var dir_path: config.getDocuments()+"/PandarViewDataFiles/csv/corrections"
                        property var data_list: []
                        function refresh() {
                            config.mkpath(dir_path)
                            var file_path_list = config.getDirFiles(dir_path)
                            // console.log(tmp)
                            correctionModel.clear()
                            data_list = []
                            for (var i in file_path_list) {
                                // console.log(i)
                                var strList = file_path_list[i].split('/')
                                // console.log(strList.length)
                                var item = {
                                    text: strList.pop(),
                                    path: file_path_list[i]
                                }
                                data_list.push(item)
                                correctionModel.append(item)
                            }
                        }
                        model: ListModel {
                            id: correctionModel
                            ListElement { text: "default_PandarXT.csv"; }
                        }
                        onCurrentIndexChanged: {
                            // console.log(currentIndex, data_list[currentIndex])
                            if (currentIndex >= 0 && currentIndex < data_list.length) {
                                if (modelData.importCorrectionsFile(data_list[currentIndex].path)) {
                                    console.log("Succeed to import: " + data_list[currentIndex].path)
                                    modelData.exportCorrectionsFile(config.getDocuments()+"/PandarViewDataFiles/csv/corrections/default_PandarXT.csv")
                                }
                                else {
                                    console.log("Unable to import: " + data_list[currentIndex].path)
                                    controlPanel.messageDialogOpen("Unable to import: \n" + data_list[currentIndex].path)
                                }
                            }
                        }
                        Component.onCompleted: {
                            refresh()
                            for (var i in data_list) {
                                if(data_list[i].text == "default_PandarXT.csv" && timeline.living == false){
                                    currentIndex = i
                                }
                            }
                        }
                    }
                    RowLayout {
                        spacing: 20
                        DefaultButton {
                            text: "   Import   "
                            onClicked: {
                                fileDialog.mode = 1
                                fileDialog.title = "Please choose import file"
                                fileDialog.selectExisting = true
                                fileDialog.open()
                            }
                        }
                        DefaultButton {
                            text: "   Export   "
                            onClicked: {
                                fileDialog.mode = 2
                                fileDialog.title = "Please choose export file"
                                fileDialog.selectExisting = false
                                fileDialog.open()
                            }
                        }
                    }

                    Rectangle {
                        height: 5
                    }
                    Rectangle {
                        width: correctionComboBox.width
                        height: 2
                        color: activePalette.button
                    }
                    Label {
                        text: "Firetime Correction"
                        color: activePalette.text
                    }
                    RowLayout {
                        Label {
                            text: "OFF"
                            color: activePalette.text
                        }
                        DefaultSwitch {
                            id: firetimeCorrection
                            focusPolicy: Qt.NoFocus 
                            onClicked: {
                                if(checked){
                                    modelData.setFiretimeCorrectionState(true)
                                }
                                else{
                                    modelData.setFiretimeCorrectionState(false)
                                }
                            }
                            onDoubleClicked: {
                                if(!checked){
                                    modelData.setFiretimeCorrectionState(true)
                                }
                                else{
                                    modelData.setFiretimeCorrectionState(false)
                                }
                            }
                            ToolTip {
                                visible: parent.hovered
                                delay: 500
                                text: qsTr("Firetime Correction Switch")
                            }                        
                        }
                        Label {
                            text: "ON"
                            color: activePalette.text
                        }
                    }
                    DefaultComboBox {
                        implicitHeight: 36
                        implicitWidth: 240
                        focusPolicy: Qt.NoFocus
                        id: firetimeComboBox
                        property var dir_path: config.getDocuments()+"/PandarViewDataFiles/csv/firetimes"
                        property var data_list: []
                        function refresh() {
                            config.mkpath(dir_path)
                            var file_path_list = config.getDirFiles(dir_path)
                            // console.log(tmp)
                            firetimeModel.clear()
                            data_list = []
                            for (var i in file_path_list) {
                                // console.log(i)
                                var strList = file_path_list[i].split('/')
                                // console.log(strList.length)
                                var item = {
                                    text: strList.pop(),
                                    path: file_path_list[i]
                                }
                                data_list.push(item)
                                firetimeModel.append(item)
                            }
                        }
                        model: ListModel {
                            id: firetimeModel
                            ListElement { text: "default_PandarXT.csv"; }
                        }
                        onCurrentIndexChanged: {
                            // console.log(currentIndex, data_list[currentIndex])
                            if (currentIndex >= 0 && currentIndex < data_list.length) {
                                if (modelData.importFiretimesFile(data_list[currentIndex].path)) {
                                    console.log("Succeed to import: " + data_list[currentIndex].path)
                                     modelData.exportFiretimesFile(config.getDocuments()+"/PandarViewDataFiles/csv/firetimes/default_PandarXT_firetime.csv")
                                }
                                else {
                                    console.log("Unable to import: " + data_list[currentIndex].path)
                                    controlPanel.messageDialogOpen("Unable to import: \n" + data_list[currentIndex].path)
                                }
                            }
                        }
                        Component.onCompleted: {
                            refresh()
                            for (var i in data_list) {
                                if(data_list[i].text == "default_PandarXT_firetime.csv" && timeline.living == false){
                                    currentIndex = i
                                }
                            }
                        }
                    }
                    RowLayout {
                        spacing: 20
                        DefaultButton {
                            // implicitHeight: 24
                            text: "   Import   "
                            onClicked: {
                                fileDialog.mode = 3
                                fileDialog.title = "Please choose import file"
                                fileDialog.selectExisting = true
                                fileDialog.open()
                            }
                        }
                        DefaultButton {
                            // implicitHeight: 24
                            text: "   Export   "
                            onClicked: {
                                fileDialog.mode = 4
                                fileDialog.title = "Please choose export file"
                                fileDialog.selectExisting = false
                                fileDialog.open()
                            }
                        }
                    }

                    Rectangle {
                        height: 5
                    }
                    Rectangle {
                        width: correctionComboBox.width
                        height: 2
                        color: activePalette.button
                    }
                    Label {
                        text: "Distance Correction"
                        color: activePalette.text
                    }
                    RowLayout {
                        Label {
                            text: "OFF"
                            color: activePalette.text
                        }
                        DefaultSwitch {
                            id: distanceCorrection
                            focusPolicy: Qt.NoFocus
                            onClicked: {
                                if(checked){
                                    modelData.distanceCorrectionState = true
                                }
                                else{
                                    modelData.distanceCorrectionState = false
                                }
                            }
                            onDoubleClicked: onClicked()
                            ToolTip {
                                visible: parent.hovered
                                delay: 500
                                text: qsTr("Distance Correction Switch")
                            }
                        }
                        Label {
                            text: "ON"
                            color: activePalette.text
                        }
                    }
                    Rectangle {
                        height: 10
                    }
                } 
            }

        }
    }


    RowLayout {
        id: pandar
        spacing: 1
        parent: blueToolBar
        function updateRightHUDWidth() {
            rightHUD.width = (pointxyziSpreadSheet.visible ? pointxyziSpreadSheet.width : 0)
                    + (channelView.visible ? channelView.width : 0)
        }
        DefaultToolButton {
            id: channelButton
            text:'Channels'
            icon.source: 'file:png/clipboard.png'
            highlighted: channelView.visible
            onClicked: {
                channelView.visible = !channelView.visible
                pandar.updateRightHUDWidth()
            }
            onDoubleClicked: onClicked()
            Action {
                id: channelAction
                shortcut: "Ctrl+T"
                onTriggered: channelButton.onClicked()
            }
            ToolTip {
                visible: channelButton.hovered
                delay: 500
                text: qsTr("Channels (Ctrl+T)")
            }
        }
        DefaultToolButton {
            id: spreadSheetButton
            text:'Spread Sheet'
            icon.source: 'file:png/table.png'
            checkable: true
            highlighted: checked
            function enableSpreadSheet( enabled ) {
                pointxyziSpreadSheet.visible = enabled
                modelData.spreadSheetEnabled = enabled
                pandar.updateRightHUDWidth()
            }
            onClicked: {
                enableSpreadSheet(checked)
            }
            onDoubleClicked: {
                enableSpreadSheet(!checked)
            }
            Action {
                id: spreadSheetAction
                shortcut: "Ctrl+D"
                onTriggered: {
                    spreadSheetButton.checked = !spreadSheetButton.checked
                    spreadSheetButton.onClicked()
                }
            }
            ToolTip {
                visible: spreadSheetButton.hovered
                delay: 500
                text: qsTr("Spread Sheet (Ctrl+D)")
            }
        }
        FilterWindowV2 {
            id: filterWindow
        }
        DefaultToolButton {
            id: filterButton
            icon.source: 'file:png/filter.png'
            highlighted: modelData.filterModel.filterEnabled
            onClicked: filterWindow.show()
            Action {
                shortcut: "Ctrl+J"
                onTriggered: filterButton.onClicked()
            }
            ToolTip {
                visible: parent.hovered
                delay: 500
                text: qsTr("Filter (Ctrl+J)")
            }
        }
        DefaultToolButton {
            id: lasersButton
            text:'Laser Tracing'
            icon.source: 'file:png/Sensor.png'
            checkable: true
            highlighted: checked
            onClicked: {
                if (checked) {
                    lasersEntityLoader.source = "LasersEntity.qml"
                }
                else {
                    lasersEntityLoader.source = ""
                }
            }
            onDoubleClicked: {
                if (!checked) {
                    lasersEntityLoader.source = "LasersEntity.qml"
                }
                else {
                    lasersEntityLoader.source = ""
                }
            }
            Action {
                id: lasersAction
                shortcut: "Ctrl+L"
                onTriggered: {
                    lasersButton.checked = !lasersButton.checked
                    lasersButton.onClicked()
                }
            }
            ToolTip {
                visible: lasersButton.hovered
                delay: 500
                text: qsTr("Laser Tracing (Ctrl+L)")
            }
        }
        DefaultToolButton {
            id: stateInfoButton
            text:'State info'
            icon.source: 'file:png/stateInfo.png'
            highlighted: pointxyziStatusText.visible
            onClicked: {
                modelData.statusEnabled =  !modelData.statusEnabled
                pointxyziStatusText.visible =  !pointxyziStatusText.visible
            }
            onDoubleClicked: {
                modelData.statusEnabled =  !modelData.statusEnabled
                pointxyziStatusText.visible =  !pointxyziStatusText.visible
            }
            Action {
                id: stateInfoAction
                shortcut: "Ctrl+I"
                onTriggered: {
                    stateInfoButton.onClicked()
                }
            }
            ToolTip {
                visible: stateInfoButton.hovered
                delay: 500
                text: qsTr("State Info (Ctrl+I)")
            }
        }
    }
    RowLayout{
        spacing: 1
        parent:aftercolorbar
        Rectangle {
            id:colormapbar
            implicitWidth: 48
            implicitHeight: 42
            color: "transparent"
            DefaultToolButton {
                id: colorEditorButton
                highlighted: colorEditorPanel.visible
                icon.source: 'file:png/colormap.png'
                onClicked: colorEditorPanel.visible = !colorEditorPanel.visible
                onDoubleClicked: onClicked()
                Action {
                    shortcut: "Ctrl+K"
                    onTriggered: colorEditorButton.onClicked()
                }
                ToolTip {
                    visible: parent.hovered
                    delay: 500
                    text: qsTr("Color Map (Ctrl+K)")
                } 
            }
            ColorEditor {
                id:colorEditorPanel 
            }
        }

        Rectangle {
            implicitWidth: 48
            implicitHeight: 42
            color: "transparent"
            visible: modelData.splitWindow
            DefaultToolButton {
                id: colorEditorButton2
                highlighted: colorEditorPanel2.visible
                icon.source: 'file:png/colormap.png'
                onClicked: colorEditorPanel2.visible = !colorEditorPanel2.visible
                onDoubleClicked: onClicked()
                Action {
                    shortcut: "Ctrl+;"
                    onTriggered: colorEditorButton2.onClicked()
                }
                ToolTip {
                    visible: parent.hovered
                    delay: 500
                    text: qsTr("Color Map 2 (Ctrl+;)")
                } 
            }
            ColorEditorSplit {
                id: colorEditorPanel2
            }
        }
        PointSizeSpinBox {}
        PointSizeSpinBoxSplit {}
        Rectangle {
            implicitWidth: 12
            implicitHeight: 36
            color: "transparent"
        }
        ReturnModeEditor {}
        Rectangle {
            implicitWidth: 18
            implicitHeight: 36
            color: "transparent"
        }
    }
    Text {
        id: distanceMeasureText
        parent: topHUD
        anchors.top: parent.top
        anchors.horizontalCenter: parent.horizontalCenter
        wrapMode: Text.WordWrap
        visible: false
        font.bold: true
        font.pointSize: 14
        color: "white"
        
    }
    Text {
        id: pointxyziStatusText
        visible: true
        parent: bottomHUD
        anchors.left: parent.left
        anchors.bottom: parent.bottom
        wrapMode: Text.WordWrap
        text: modelData.status
        
        font.pointSize: 12
        color: activePalette.windowText
    }

    ChannelView {
        id: channelView
        parent: rightHUD
        visible: false
    }
    SpreadSheet {
        id: pointxyziSpreadSheet
        parent: rightHUD
        visible: false
    }

    Timer {
        interval: 10
        running: true
        repeat: false
        onTriggered: {
            if (timeline.living == false){
                timeline.cursorSeconds += 0.11
            }
        }
    }


}
