from time import sleep
import os

from loguru import logger

from src.utils.base.base import BaseDirectoryMonitor


class DirectoryMonitor(BaseDirectoryMonitor):

    def _init_state(self):
        files = os.listdir(self._directory_path)
        self._files = files

        self.update_timer.timeout.connect(self._monitor)
        logger.info("Monitor initiated!")

    def _monitor(self):
        files = os.listdir(self._directory_path)
        new_files = sorted(list(map(lambda x: os.path.join(self._directory_path, x),
                                    filter(lambda x: x not in self._files, files))))
        if new_files:
            logger.info(f"New files detected: {new_files}")
            self._mediator.notify(self, new_files)
            self._files = files
        if not files:
            self._files = []

    def update_settings(self, data: list[dict]) -> None:
        self.stop()
        operator_params, system_params = data
        self._directory_path = system_params['trace_storage_path']
        self._update_time = system_params['monitor_update_period']
        self._init_state()
        self.start()

    def force_all_dir(self):
        files = os.listdir(self._directory_path)
        self._files = files
        all_files = []
        for x in self._files:
            path = os.path.join(self._directory_path, x)
            all_files.append(path)
        if all_files:
            logger.info(f"Plotting all files: {all_files}")
            self._mediator.notify(self, all_files)
        else:
            logger.info(f"Failed pushing {str(all_files)}")



