class _MainTester(unittest.TestCase):
    def setUp(self):
        self.mainGui = MainWindow()

    def initializeData(self, dataNumber):
        test_folder = testData[dataNumber]
        self.rawVectorData, self.omf_header, self.odtData, self.stages = MultiprocessingParse.readFolder(
            test_folder)

    def test_initialGui(self):
        self.assertEqual(self.mainGui.windowTitle(),
                         "ESE - Early Spins Enviroment")
        self.assertTrue(self.mainGui.width() > 200)
        self.assertTrue(self.mainGui.height() > 100)
        self.assertTrue(len(self.mainGui.panes) == 4)
        self.assertTrue(self.mainGui.panes[0].isVisible())
        self.assertFalse(self.mainGui.panes[1].isVisible())
        self.assertFalse(self.mainGui.panes[2].isVisible())
        self.assertFalse(self.mainGui.panes[3].isVisible())

    '''def test_loadDirectory(self):
        self.initializeData()
        print(self.mainGui.children())
        self.mainGui.actionLoad_Directory.trigger()
        self.assertTrue(len(self.mainGui.odt_data) > 0)
    '''

    def test_ViewListeners(self):
        self.mainGui.action2_Windows_Grid.trigger()
        self.assertTrue(self.mainGui.panes[0].isVisible())
        self.assertTrue(self.mainGui.panes[1].isVisible())
        self.assertFalse(self.mainGui.panes[2].isVisible())
        self.assertFalse(self.mainGui.panes[3].isVisible())

        self.mainGui.action4_Windows_Grid.trigger()
        self.assertTrue(self.mainGui.panes[0].isVisible())
        self.assertTrue(self.mainGui.panes[1].isVisible())
        self.assertTrue(self.mainGui.panes[2].isVisible())
        self.assertTrue(self.mainGui.panes[3].isVisible())

        self.mainGui.action2_Windows_Grid.trigger()
        self.assertTrue(self.mainGui.panes[0].isVisible())
        self.assertTrue(self.mainGui.panes[1].isVisible())
        self.assertFalse(self.mainGui.panes[2].isVisible())
        self.assertFalse(self.mainGui.panes[3].isVisible())

        self.mainGui.action1_Window_Grid.trigger()
        self.assertTrue(self.mainGui.panes[0].isVisible())
        self.assertFalse(self.mainGui.panes[1].isVisible())
        self.assertFalse(self.mainGui.panes[2].isVisible())
        self.assertFalse(self.mainGui.panes[3].isVisible())

    def test_PlotSettingsNoData(self):
        self.mainGui.actionPlot.trigger()
        label = self.mainGui.plotSettingsWindow.findChild(
            QtWidgets.QLabel, "textLabel")
        self.assertEqual(
            label.text(),
            "There is no data to show. Load data with File > Load Directory")
        accept = self.mainGui.plotSettingsWindow.buttonBox.children()[1]
        QTest.mouseClick(accept, Qt.LeftButton)

    def test_PlotSettingsDataLoaded(self):
        '''tests scenario when data is selected and plot settings clicked. There should be message that no plot has been selected'''
        self.initializeData(0)
        self.mainGui.rawVectorData = self.rawVectorData
        self.mainGui.omf_header = self.omf_header
        self.mainGui.odt_data = self.odtData
        self.mainGui.stages = self.stages

        self.mainGui.actionPlot.trigger()
        label = self.mainGui.plotSettingsWindow.findChild(
            QtWidgets.QLabel, "textLabel")
        self.assertEqual(
            label.text(),
            "No plot pane selected, Go to MainWindow and select pane type meant to show plot."
        )
        accept = self.mainGui.plotSettingsWindow.buttonBox.children()[1]
        QTest.mouseClick(accept, Qt.LeftButton)

    def test_Widgets(self):
        for i in range(4):
            QTest.mouseClick(self.mainGui.panes[i].button, Qt.LeftButton)
            self.mainGui.new.list.setCurrentRow(1)  #Plot2D
            QTest.mouseClick(self.mainGui.new.addButton, Qt.LeftButton)
            self.assertEqual(type(self.mainGui.panes[i].widget), Canvas)

        #this one is problem because of threading - program is not endig after tests completed because of threads in background
    def test_plotSettingsProperData(self):
        for i, _ in enumerate(testData):
            self.initializeData(i)
            self.mainGui.rawVectorData = self.rawVectorData
            self.mainGui.omf_header = self.omf_header
            self.mainGui.odt_data = self.odtData
            self.mainGui.stages = self.stages

            #add 2D plot Widget
            QTest.mouseClick(self.mainGui.panes[0].button, Qt.LeftButton)
            self.mainGui.new.list.setCurrentRow(1)  #createPlot2D
            QTest.mouseClick(self.mainGui.new.addButton, Qt.LeftButton)

            self.assertEqual(type(self.mainGui.panes[0].widget), Canvas)
            self.assertNotEqual(type(self.mainGui.panes[0].widget),
                                CanvasLayer)

            self.mainGui.actionPlot.trigger()
            #print(self.mainGui.plotSettingsWindow.children()[0].children()[2].children()[1])
            self.mainGui.plotSettingsWindow.comboBox[0].setCurrentIndex(5)
            #self.mainGui.plotSettingsWindow.radioButton[1].setChecked(True)

            print(
                self.mainGui.plotSettingsWindow.buttonBox.children()[1].text())
            QTest.mouseClick(
                self.mainGui.plotSettingsWindow.buttonBox.children()[1],
                Qt.LeftButton)

    def test_AnimationSettings(self):
        '''checking if Gui is disabled when there is no data'''
        self.mainGui.showAnimationSettings()

        for element in self.mainGui.playerWindow.gui.elements:
            self.assertFalse(element.isEnabled())

        #GUI still should be disabled
        self.mainGui._LOADED_FLAG_ = True
        for element in self.mainGui.playerWindow.gui.elements:
            self.assertFalse(element.isEnabled())

        self.initializeData(0)
        self.mainGui.rawVectorData = self.rawVectorData
        self.mainGui.omf_header = self.omf_header
        self.mainGui.odt_data = self.odtData
        self.mainGui.stages = self.stages

        # add 2D plot Widget
        QTest.mouseClick(self.mainGui.panes[0].button, Qt.LeftButton)
        self.mainGui.new.list.setCurrentRow(1)  # createPlot2D
        QTest.mouseClick(self.mainGui.new.addButton, Qt.LeftButton)

        self.mainGui.playerWindow.reloadGui()

        for element in self.mainGui.playerWindow.gui.elements:
            self.assertTrue(element.isEnabled())

    def test_PlayerWindow_sliderSpeed(self):
        self.initializeData(0)
        self.mainGui.rawVectorData = self.rawVectorData
        self.mainGui.omf_header = self.omf_header
        self.mainGui.odt_data = self.odtData
        self.mainGui.stages = self.stages
        self.mainGui._LOADED_FLAG_ = True

        QTest.mouseClick(self.mainGui.panes[0].button, Qt.LeftButton)
        self.mainGui.new.list.setCurrentRow(1)  # createPlot2D
        QTest.mouseClick(self.mainGui.new.addButton, Qt.LeftButton)

        self.mainGui.showAnimationSettings()
        x = self.mainGui.playerWindow.gui.slider_speed
        x.setValue(x.minimum())
        self.assertEqual(self.mainGui.playerWindow.gui.speedLabel.text(),
                         "Animation Speed: 0.1")
        x.setValue(x.maximum())
        self.assertEqual(self.mainGui.playerWindow.gui.speedLabel.text(),
                         "Animation Speed: 10.0")