from bonobo.config import Configurable, ContextProcessor, Option, Service


class FileHandler(Configurable):
    """Abstract component factory for file-related components.

    Args:
        fs (str): service name to use for filesystem.
        path (str): which path to use within the provided filesystem.
        eol (str): which character to use to separate lines.
        mode (str): which mode to use when opening the file.
        encoding (str): which encoding to use when opening the file.
    """

    path = Option(str, required=True, positional=True, __doc__='''
        Path to use within the provided filesystem.
    ''')  # type: str
    eol = Option(str, default='\n', __doc__='''
        Character to use as line separator.
    ''')  # type: str
    mode = Option(str, __doc__='''
        What mode to use for open() call.
    ''')  # type: str
    encoding = Option(str, default='utf-8', __doc__='''
        Encoding.
    ''')  # type: str
    fs = Service('fs', __doc__='''
        The filesystem instance to use.
    ''')  # type: str

    @ContextProcessor
    def file(self, context, *, fs):
        with self.open(fs) as file:
            yield file

    def open(self, fs):
        return fs.open(self.path, self.mode, encoding=self.encoding)


class Reader:
    pass


class Writer:
    pass
