import sys
from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMenuBar, QToolBar, QAction, QStatusBar
from PyQt5.QtGui import QIcon, QKeySequence
from PyQt5.QtCore import QSize, QSettings, Qt

from file_handler import FileHandler, NodeType
import constants as cnst
import communicator as comm
from central_widget import CentralWidget

class NixView(QMainWindow):
    
    def __init__(self, *args, **kwargs):
        super(NixView, self).__init__(*args, **kwargs)
        self._current_item = None
        self.setWindowTitle("NixView")
        self.setWindowIcon(QIcon('./icons/nixview.icns'))

        self._file_handler = FileHandler()
        self.setStatusBar(QStatusBar(self))
        self.setMenuBar(QMenuBar(self))
        self.create_actions()
        
        self._cw = CentralWidget(self)
        self.setCentralWidget(self._cw)
        
        comm.communicator.open_recent.connect(self.on_open_recent)
        comm.communicator.item_selected.connect(self.on_item_selected)
        self.show()

    def on_open_recent(self, event):
        self.open_file(event)

    def on_item_selected(self, current):
        self._current_item = current
        current_item_type = current._node_descriptor.entity_type
        enable = current_item_type == NodeType.MultiTag or current_item_type == NodeType.DataArray or current_item_type == NodeType.Tag
        self._plot_action.setEnabled(enable)
        self._table_action.setEnabled(enable)
        
    def create_actions(self):
        self._file_open_action = QAction(QIcon("./icons/nix_open.png"), "Open", self)
        self._file_open_action.setStatusTip("Open nix file")
        self._file_open_action.setShortcut(QKeySequence("Ctrl+o"))
        self._file_open_action.triggered.connect(self.on_file_open)
        
        self._file_close_action = QAction(QIcon("./icons/nix_close.png"), "Close", self)
        self._file_close_action.setStatusTip("Close current nix file")
        self._file_close_action.setShortcut(QKeySequence("Ctrl+w"))
        self._file_close_action.setEnabled(False)
        self._file_close_action.triggered.connect(self.on_file_close)
        
        self._quit_action = QAction(QIcon("./icons/quit.png"), "Quit", self)
        self._quit_action.setStatusTip("Close current file and quit")
        self._quit_action.triggered.connect(self.on_quit)
        
        self._plot_action = QAction(QIcon("./icons/nix_plot.png"), "Plot", self)
        self._plot_action.setStatusTip("Plot currently selected entity")
        self._plot_action.setShortcut(QKeySequence("Ctrl+p"))
        self._plot_action.setEnabled(False)
        self._plot_action.triggered.connect(self.on_item_plot)
        
        self._table_action = QAction(QIcon("./icons/nix_table.png"), "Show table", self)
        self._table_action.setStatusTip("Show data as table")
        self._table_action.setShortcut(QKeySequence("Ctrl+t"))
        self._table_action.setEnabled(False)
        # self._table_action.triggered.connect(self.on_file_close)
        self.create_toolbar()
        self.create_menu() 
    
    def create_toolbar(self):
        self._toolbar = QToolBar("My main toolbar")
        #self._toolbar.setStyleSheet("QToolButton:!hover {background-color:none}")
        self._toolbar.setAllowedAreas(Qt.LeftToolBarArea | Qt.TopToolBarArea)
        self._toolbar.setIconSize(QSize(32, 32))

        self._toolbar.addAction(self._file_open_action)
        self._toolbar.addAction(self._file_close_action)
        self._toolbar.addAction(self._quit_action)
        self._toolbar.addSeparator()
        self._toolbar.addAction(self._plot_action)
        self._toolbar.addAction(self._table_action)
        self.addToolBar(Qt.LeftToolBarArea, self._toolbar)

    def create_menu(self):
        menu = self.menuBar()
        file_menu = menu.addMenu("&File")
        file_menu.addAction(self._file_open_action)
        file_menu.addAction(self._file_close_action)
        file_menu.addAction(self._quit_action)
        
        plot_menu = menu.addMenu("&Plot")
        plot_menu.addAction(self._plot_action)
        plot_menu.addAction(self._table_action)
        
        self.setMenuBar(menu)
    
    def _update_recent_files(self, filename):
        settings = QSettings(cnst.organization, cnst.application)
        recent_file_max_count = settings.value(cnst.settings_recent_file_max_count_key, 10, type=int)
        filenames = settings.value(cnst.settings_recent_files_key, [])
        new_filenames = [filename]
        if filename in filenames:
            del filenames[filenames.index(filename)]
        new_filenames.extend(filenames)
        settings.setValue(cnst.settings_recent_files_key, new_filenames[:recent_file_max_count])
        del settings
    
    def open_file(self, filename):
        self._current_item = None
        success, msg = self._file_handler.open(filename)
        self.statusBar().showMessage(msg, 5000)
        if success:
            self._file_close_action.setEnabled(success)
            self._cw.show_file_content()
            self._update_recent_files(filename)

    def on_file_open(self, s):
        dlg = QFileDialog(self, 'Open nix data file', '', "NIX files (*.h5 *.nix)")
        dlg.setFileMode(QFileDialog.ExistingFile)
        filenames = None
        if dlg.exec_():
            filenames = dlg.selectedFiles()
            self.open_file(filenames[0])
            
    def on_file_close(self, s):
        self._file_handler.close()
        self._cw.reset()
        self._current_item = None
        self._file_close_action.setEnabled(False)
        self.statusBar().showMessage("Successfully closed current file", 1000)

    def on_quit(self, s):
        self._file_handler.close()
        sys.exit()
        
    def on_item_plot(self, s):
        if self._current_item is not None:
            self._cw.plot_item(self._current_item)