import os

from rp.libs.parso import file_io


class AbstractFolderIO(object):
    def __init__(self, path):
        self.path = path

    def list(self):
        raise NotImplementedError

    def get_file_io(self, name):
        raise NotImplementedError


class FolderIO(AbstractFolderIO):
    def list(self):
        return os.listdir(self.path)

    def get_file_io(self, name):
        return FileIO(os.path.join(self.path, name))


class FileIOFolderMixin(object):
    def get_parent_folder(self):
        return FolderIO(os.path.dirname(self.path))


class ZipFileIO(file_io.KnownContentFileIO, FileIOFolderMixin):
    """For .zip and .egg archives"""
    def __init__(self, path, code, zip_path):
        super(ZipFileIO, self).__init__(path, code)
        self._zip_path = zip_path

    def get_last_modified(self):
        try:
            return os.path.getmtime(self._zip_path)
        except OSError:  # Python 3 would probably only need FileNotFoundError
            return None


class FileIO(file_io.FileIO, FileIOFolderMixin):
    pass


class KnownContentFileIO(file_io.KnownContentFileIO, FileIOFolderMixin):
    pass
