import os
from PyQt5.QtWidgets import QFrame, QLabel, QListWidget, QListWidgetItem, QStackedLayout, QVBoxLayout, QWidget, QGridLayout, QSpacerItem, QSizePolicy, QTreeView, QHeaderView
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QSettings

from file_handler import FileHandler
import communicator as comm
import constants as cnst
from tree_model import TreeModel

class CentralWidget(QWidget):
    
    def __init__(self, parent=None) -> None:
        super().__init__(parent=parent)
        
        self._splash = SplashScreen()
        self._file_view = FileView(self)
        self._stack = QStackedLayout(self)
        self._stack.addWidget(self._splash)
        self._stack.addWidget(self._file_view)
        self.setLayout(self._stack)
        self.setStyleSheet("background-color: white;")

    def show_file_content(self):
        self._stack.setCurrentIndex(1)
        self._file_view.update()

    def reset(self):
        self._file_view.reset()
        self._splash.reset()
        self._stack.setCurrentIndex(0)


class FileView(QWidget):
    
    def __init__(self, parent=None) -> None:
        super().__init__(parent=parent)
        self._file_handler = FileHandler()

        grid = QGridLayout()
        grid.addWidget(QLabel("FileView"), 0, 0, 1, 3)
        self.setLayout(grid)
   
        self._view = QTreeView()
        self._view.setAlternatingRowColors(True)
        self._view.setUniformRowHeights(True)  # Allows for scrolling optimizations.
        self._view.setWindowTitle("Simple Tree Model")
        header = self._view.header()
        header.setStretchLastSection(False)
        header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(0, QHeaderView.Stretch)
        grid.addWidget(self._view, 1, 0, 3, 3)

    def update(self):
        model = TreeModel(self._file_handler)
        self._view.setModel(model)
        
    def reset(self):
        print("FileView ", self._file_handler.is_valid)
        pass

class SplashScreen(QWidget):
    
    def __init__(self, parent=None) -> None:
        super().__init__(parent=parent)
        layout = QGridLayout()
        self.setLayout(layout)
        self.setStyleSheet("background-color: white;")
        label = QLabel()
        label.setPixmap(QPixmap("./icons/nixview256.png"))
        label.setAlignment(Qt.AlignCenter)
        
        layout.addWidget(label, 1, 1)
        verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
        verticalSpacer2 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
        hSpacer = QSpacerItem(400, 20, QSizePolicy.Maximum, QSizePolicy.Expanding)
        hSpacer2 = QSpacerItem(400, 20, QSizePolicy.Maximum, QSizePolicy.Expanding)
        layout.addItem(verticalSpacer, 0, 1)
        layout.addItem(verticalSpacer2, 2, 1)
        layout.addItem(hSpacer, 1, 0)
        layout.addItem(hSpacer2, 1, 2)
        frame = QFrame()
        l  = QVBoxLayout()
        l.addWidget(QLabel("Recently opened files:"))
        
        self._file_list = QListWidget(self)
        self._file_list.itemClicked.connect(self._on_file_clicked)
        l.addWidget(self._file_list)
        frame.setLayout(l)
        layout.addWidget(frame, 3, 1)
        self._file_map = {}
        self._read_recent_files()
        
    def _create_short_filename(self, original, index, max_len=40):
        short = original
        parts = original.split(os.sep)
        post = parts[-1]
        if len(post) > max_len - 4:
            post = post[:max_len - 4]
            short = str("%i: " % index) + "... " + post
        else:
            short = str("%i: " % index) + " ... ".join([original[:max_len - len(post) - 4], post])
        return short
        
    def _read_recent_files(self):
        settings = QSettings(cnst.organization, cnst.application)
        filenames = settings.value(cnst.settings_recent_files_key, [])
        del settings

        for i, f in enumerate(filenames):
            shortname = self._create_short_filename(f, i + 1, max_len=38)
            self._file_map[shortname] = f
            item = QListWidgetItem(shortname)
            item.setToolTip(f)
            self._file_list.addItem(item)

    def reset(self):
        self._file_list.clear()
        self._read_recent_files() 

    def _on_file_clicked(self, item):
        comm.communicator.open_recent.emit(self._file_map[item.text()])