from typing import Union

from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QFileDialog, QWidget, QListWidgetItem

from interface.mainwindow import MainWindow
from loaders import CSVManager


class WindowManager:
    """
    Class used to manage the Qt window and its associated data.

    Attributes:
        _window: Private, contains the main window.
        _csv_manager: Private, holds a CSV manager.

    """
    _window: Union[QWidget, MainWindow] = None  # Qt window managed by this class
    _csv_manager: CSVManager = None  # Object used to manage CSV data

    def __init__(self):
        """
        Initialize our window manager.

        """
        loader = QUiLoader()
        self._window = loader.load("files/designer/demo-dialog.ui")
        # Once the window is loaded, connect actions to code
        self.setup_actions()

    def setup_actions(self):
        """Connect actions of controls to methods."""
        self._window.file_button.clicked.connect(self.on_file_select)
        self._window.button_csv_export.clicked.connect(self.on_export_csv)

    def on_file_select(self):
        """
        Action when the file button is clicked.

        Shows a file select dialog to pick a CSV
        and loads the CSV file in the CSVManager instance of the object.

        """
        filter_text = "CSV File (*.csv)"
        selection: tuple = QFileDialog.getOpenFileName(self._window, "CSV File", "", filter_text)
        path: str = selection[0]
        if path:
            self._csv_manager = CSVManager(path)
            self._window.button_csv_export.setEnabled(True)
            # Empty list items and enable the list widget
            self._window.list_widget.clear()
            self._window.list_widget.setEnabled(True)
            # Add rows in the list widget containing CSV rows
            for row in self._csv_manager.data:
                item = QListWidgetItem(";".join(row))
                self._window.list_widget.addItem(item)

    def on_export_csv(self):
        """
        Action when the export to CSV button is clicked.

        Shows a file select dialog to select a file destination.
        The output file is then saved to the selected path.

        """
        filter_text = "Text File (*.txt)"
        selection: tuple = QFileDialog.getSaveFileName(self._window, "Text File", "", filter_text)
        path: str = selection[0]
        if path:
            self._csv_manager.export_text(selection[0])

    def show(self):
        """
        Public method to show our window.

        The window is loaded automatically at instanciation
        in the `__init__` method.

        """
        self._window.show()
