#!/usr/bin/python3
import os.path

from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QTextEdit
from PyQt5 import uic, QtCore, QtGui, QtWidgets
import sys
import prototype
import json
import time
import analysis


class TestStandMainWindow(QMainWindow):
    def __init__(self, qt_app, *args, **kwargs):
        super().__init__(*args, **kwargs)
        uic.loadUi('climate-lab-main.ui', self)
        self.qt_app = qt_app

        self.startButton.clicked.connect(lambda: self.do_measurement())
        self.tempSweepButton.clicked.connect(lambda: self.set_temp_sweep_labels())
        self.humSweepButton.clicked.connect(lambda: self.set_hum_sweep_labels())

        self.start_dir = os.getcwd()

    def set_temp_sweep_labels(self):
        self.parametersGroupBox.setEnabled(True)
        self.startStopStepGroupBox.setTitle('Temperature [degC]')
        self.fixedParameterLabel.setText('Humidity [% r.h.]')

    def set_hum_sweep_labels(self):
        self.parametersGroupBox.setEnabled(True)
        self.startStopStepGroupBox.setTitle('Humidity [% r.h.]')
        self.fixedParameterLabel.setText('Temperature [degC]')

    def check_and_change_dir(self, data_folder):
        if os.path.exists(data_folder):
            if os.path.isdir(data_folder):
                button_reply = QtWidgets.QMessageBox.question(self, 'Warning: \'' + data_folder + '\' already exists',
                                                              'Overwrite data in \'' + data_folder + '\'?',
                                                              QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                                              QtWidgets.QMessageBox.No)
                if not button_reply == QtWidgets.QMessageBox.Yes:
                    return False
            else:
                QtWidgets.QMessageBox.critical(self, 'Error', '\'' + data_folder + '\' exists but is not a directory!')
                return False
        else:
            try:
                os.makedirs(data_folder)
            except:
                QtWidgets.QMessageBox.critical(self, 'Error', 'Cannot create folder \'' + data_folder + '\'!')
                return False
        os.chdir(data_folder)
        print('changed dir')
        return True

    def do_measurement(self):
        self.setEnabled(False)
        self.qt_app.processEvents();

        os.chdir(self.start_dir)
        with open('test_stand_parameter.json', 'r') as f:
            config_data = json.load(f)
       
        # open json file ext_sens_data.joson and load values from file 
        with open('ext_sensor_param.json', 'r') as f2:
            config_ext_sens_data = json.load(f2)

        if self.autoNameCheckbox.isChecked():
            output_basename = time.strftime("%Y_%m_%d-%H_%M_%S") + "_results"
        else:
            output_basename = self.baseName.text()

        if not self.check_and_change_dir(config_data['data_folder'] + '/' + output_basename):
            self.setEnabled(True)
            return
        
    
        # ext_sens_data are the imported values from json file ext_sens_data.json , Michael
        # config_data['logger_ip'] is the imported ip from jason file test_stand_parameter.json, Michael
        meas = prototype.Measurements(config_data['chamber_ip'], config_data['vna_ip'], output_basename,
                                      False, config_data, config_ext_sens_data, config_data['logger_ip'])
        try:
            if self.tempSweepButton.isChecked():
                temperatures = meas.perform_sweep(self.startParameter.value(), self.stopParameter.value(),
                                                  self.stepParameter.value(), self.fixedParameter.value(),
                                                  self.soakingTime.value(), self.stableReads.value(),
                                                  'temperature')
                temp_extensions = []
                for t in temperatures:
                    temp_extensions.append(str(t) + 'deg_' + str(self.fixedParameter.value()) + 'rh')
                analysis.plot_sweep(temperatures, [self.fixedParameter.value()] * len(temperatures), output_basename,
                                    'temperature')
                
                # add ext_sens_data to parameterlist of plot_output method, Michael
                # ext_sens_data are the imported values from json file ext_sens_data.json , Michael
                prototype.plot_output(output_basename, temp_extensions, True, config_data, config_ext_sens_data, output_basename +
                                      ': Temperature sweep ' + str(temperatures[0]) + '--' +
                                      str(temperatures[-1]) + ' degC @ ' + str(self.fixedParameter.value()) + ' % r.h.')

            elif self.humSweepButton.isChecked():
                humidities = meas.perform_sweep(self.startParameter.value(), self.stopParameter.value(),
                                                self.stepParameter.value(), self.fixedParameter.value(),
                                                self.soakingTime.value(), self.stableReads.value(),
                                                'humidity')
                hum_extensions = []
                for h in humidities:
                    hum_extensions.append(str(self.fixedParameter.value()) + 'deg_' + str(h) + 'rh')
                analysis.plot_sweep([self.fixedParameter.value()] * len(humidities), humidities, output_basename,
                                    'humidity')
                                
                # add ext_sens_data to parameterlist of plot_output method, Michael
                # ext_sens_data are the imported values from json file ext_sens_data.json, Michael 
                prototype.plot_output(output_basename, hum_extensions, True, config_data, config_ext_sens_data, output_basename +
                                      ': Humidity sweep ' + str(humidities[0]) + '--' +
                                      str(humidities[-1]) + ' % r.h. @ ' + str(self.fixedParameter.value()) + ' degC')

            elif self.measurementFileButton.isChecked():
                try:
                    n_measurements = meas.perform_measurements(os.path.join(self.start_dir,
                                                                            self.measurementFile.text()))
                    # add ext_sens_data to parameterlist of plot_output method, Michael
                    # ext_sens_data are the imported values from json file ext_sens_data.json, Michael 
                    prototype.plot_output(output_basename, range(n_measurements), True, config_ext_sens_data, output_basename)
                except FileNotFoundError as e:
                    QtWidgets.QMessageBox.warning(self, 'Warning', str(e))


        finally:
            meas.chamber.close()
            meas.ext_sensors.close()
            
            self.setEnabled(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = TestStandMainWindow(app)
    mainWindow.show()
    app.exec_()