from django.utils.six import BytesIO
from .exceptions import UnknownFormatError

_delim = b':'
_formats = {}


def _bytes(seq):
    return seq.encode() if hasattr(seq, 'encode') else seq


def register(code, renderer, parser):
    code = _bytes(code)
    _formats[code] = {
        'renderer': renderer,
        'parser': parser,
    }


def unregister(code):
    code = _bytes(code)
    try:
        del _formats[code]
    except KeyError:
        pass


def render(code, data):
    code = _bytes(code)
    if code not in _formats:
        raise UnknownFormatError('Could not find renderer for format %s' % code.decode())
    body = _formats[code]['renderer'].render(data)
    return code + _delim + body


def parse(data):
    data = _bytes(data)
    code, body = data.split(_delim, 1)
    if code not in _formats:
        raise UnknownFormatError('Could not find parser for format %s' % code.decode())
    return _formats[code]['parser'].parse( BytesIO(body) )


__all__ = ['register', 'unregister', 'render', 'parse']
