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: ""
    }
    Rectangle {
        parent: root
        visible: false
        id: backgroundLightHUD
        x: (root.width - width) / 2
        y: toolBar.height
        height: 240
        width: 540
        color: activePalette.dark
        MouseArea {
            cursorShape: Qt.SizeAllCursor
            anchors.fill: parent
            acceptedButtons: Qt.LeftButton|Qt.MiddleButton|Qt.RightButton
            property real lastX: 0.0
            property real lastY: 0.0
            onPressed: {
                switch(pressedButtons) {
                    case 1: // leftButton for selection
                    {   
                        lastX = mouseX
                        lastY = mouseY  
                        
                    }
                    break;
                    default:
                    break;
                }
            }
            onPositionChanged: {
                switch(pressedButtons) {
                    case 1: // leftButton
                    {
                        var deltX = lastX - mouseX
                        var deltY = lastY - mouseY
                        backgroundLightHUD.x -= deltX
                        backgroundLightHUD.y -= deltY
                    }
                    break;
                    default:
                    break;

                }
            }
        }
        Canvas {
            id: canvas
            anchors.fill: parent
            antialiasing: true
            contextType: "2d";
            Timer {
                id: backgroundLightTimer
                interval: 100
                running: false
                repeat: true
                onTriggered: canvas.requestPaint();
            }
            onPaint: {
                var buffer = new Uint8ClampedArray(modelData.backgroundLight)
                var col = modelData.columnModel.rowCount()
                var row = modelData.channelModel.rowCount()
                var img = context.createImageData(col, row)
                for (var i = 0; i < col*row; i+=1) {
                    var j = i * 4
                    img.data[j] = buffer[i]
                    img.data[j+1] = buffer[i]
                    img.data[j+2] = buffer[i]
                    img.data[j+3] = 255
                }
                context.drawImage(img, 3, 3, backgroundLightHUD.width - 6, backgroundLightHUD.height - 6);
            }
        }
    }

    FileDialog {
        id: fileDialog
        property int mode: 0
        title: "Please choose import file"
        // folder: Qt.resolvedUrl("../csv/")
        nameFilters: [".dat/.csv/.txt (*.dat *.csv *.txt)", "ALL (*.*)"]
        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;
                case 5:
                    if(modelData.importCoordinateTransformFile(fileDialog.fileUrl)) {
                        console.log("Succeed to import importCoordinateTransformFile 5: " + fileDialog.fileUrl)
                        var src = config.url2string(fileDialog.fileUrl)
                        var filename = src.split('/').pop()
                        var dst = config.getDocuments()+"/PandarViewDataFiles/txt/corrections/"+filename;
                        if (src != dst) {
                            if(config.exists(dst))
                                config.remove(dst)
                            if(config.copy(src, dst)) {
                                subCorrectionComboBoxCoordinateTransform.refresh()
                                for (var i in subCorrectionComboBoxCoordinateTransform.data_list) {
                                    if (subCorrectionComboBoxCoordinateTransform.data_list[i].text == filename) {
                                        subCorrectionComboBoxCoordinateTransform.currentIndex = i
                                        break
                                    }
                                }
                                console.log("correctionComboBox.currentText:" + subCorrectionComboBoxCoordinateTransform.currentText)
                            }
                            else
                                controlPanel.messageDialogOpen("Unable to copy from: " + src + " to: " + dst)
                        }
                        else {
                            for (var i in subCorrectionComboBoxCoordinateTransform.data_list) {
                                if (subCorrectionComboBoxCoordinateTransform.data_list[i].text == filename) {
                                    subCorrectionComboBoxCoordinateTransform.currentIndex = i
                                    break
                                }
                            }
                            console.log("correctionComboBox.currentText:" + subCorrectionComboBoxCoordinateTransform.currentText)
                        }
                    } else {
                        console.log("Unable to import importCoordinateTransformFile 5: " + fileDialog.fileUrl)
                        controlPanel.messageDialogOpen("Unable to import importCoordinateTransformFile 5: \n" + fileDialog.fileUrl)
                    }
                    break;
                case 6:
                    if(modelData.exportCoordinateTransformFile(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
        visible: modelData.controlSelected
        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
        visible: modelData.controlSelected
        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 dir_path_dat: config.getDocuments()+"/PandarViewDataFiles/dat"
                        property var data_list: []
                        function refresh() {
                            config.mkpath(dir_path)
                            config.mkpath(dir_path_dat)
                            var file_path_list = config.getDirFiles(dir_path)
                            var file_path_list_dat = config.getDirFiles(dir_path_dat)
                            // 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)
                            }
                            for (var i in file_path_list_dat) {
                                var strList = file_path_list_dat[i].split('/')
                                // console.log(strList.length)
                                var item = {
                                    text: strList.pop(),
                                    path: file_path_list_dat[i]
                                }
                                data_list.push(item)
                                correctionModel.append(item)
                            }
                        }
                        model: ListModel {
                            id: correctionModel
                            ListElement { text: "default_PandarFT.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)
                                    var fileName = data_list[currentIndex].path.split('/').pop()
                                    var fileType = fileName.split('.').pop()
                                    if (fileType === "dat") {
                                        modelData.exportCorrectionsFile(config.getDocuments() + "/PandarViewDataFiles/dat/default_PandarFT.dat")
                                    } else {
                                        modelData.exportCorrectionsFile(config.getDocuments() + "/PandarViewDataFiles/csv/corrections/default_PandarFT.csv")
                                    }
                                    
                                }
                                else {
                                    console.log("Unable to import: " + data_list[currentIndex].path)
                                    controlPanel.messageDialogOpen("Unable to import: \n" + data_list[currentIndex].path)
                                }
                            }
                        }
                        Component.onCompleted: {
                            refresh()
                            console.log("import subVersion: " + modelData.subVersion)
                            for (var i in data_list) {
                                switch (modelData.subVersion) {
                                    case 1:
                                        if(data_list[i].text == "default_PandarFT.csv" && timeline.living == false){
                                            currentIndex = i
                                        }
                                        break;
                                    case 2:
                                        if(data_list[i].text == "default_PandarFT.dat" && timeline.living == false){
                                            currentIndex = i
                                        }
                                        break;
                                    default:
                                        break;
                                }
                           }

                        }
                    }
                    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: 10
                    }
                }
            }
        }
    }

    RowLayout {
        id: pandar
        spacing: 1
        parent: blueToolBar
        visible: modelData.controlSelected
        DefaultToolButton {
            id: channelButton
            text:'Channels'
            icon.source: 'file:png/clipboard.png'
            highlighted: channelView.visible
            onClicked: {
                channelView.visible = !channelView.visible
            }
            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
            }
            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)")
            }
        }
        DefaultToolButton {
            id: columnButton
            text:'Columns'
            icon.source: 'file:png/clipboard.png'
            highlighted: columnView.visible
            onClicked: {
                columnView.visible = !columnView.visible
            }
            onDoubleClicked: onClicked()
            Action {
                id: columnAction
                shortcut: "Ctrl+T"
                onTriggered: columnButton.onClicked()
            }
            ToolTip {
                visible: parent.hovered
                delay: 500
                text: qsTr("Columns (Ctrl+T)")
            }
        }
        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
        visible: modelData.controlSelected
        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
    }
    ColumnView {
        id: columnView
        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.31
            }
        }
    }


}
