import os
import nixio as nix
from nixio import file

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class FileHandler(metaclass=Singleton):
    
    def __init__(self) -> None:
        super().__init__()
        self._nix_file = None
        self._file_requests = []
    
    def open(self, filename):
        """[summary]

        Args:
            filename ([type]): [description]
        """
        self.close()
      
        if not os.path.exists(filename):
            return False, "File %s could not be found!" % filename
        try:
            self._nix_file = nix.File.open(filename, nix.FileMode.ReadOnly)
            return True, "Successfully opened file %s." % filename.split(os.sep)[-1]
        except RuntimeError as e:
            return False, "Failed to open file %s! \n Error message is: %s" % (filename, e)
        except OSError as e:
            return False, "Failed to open file %s! \n Error message is: %s\n Probably no nix file?!" % (filename, e)

    def close(self):
        # TODO check if there are any pending file requests!
        if self._nix_file is not None and self._nix_file.is_open():
            self._nix_file.close()
            self._nix_file = None
            self._file_requests = []
    
    @property
    def is_valid(self):
        return self._nix_file is not None and self._nix_file.is_open()