# -*- coding: utf-8 -*-

from __future__ import absolute_import

from benedict.serializers.abstract import AbstractSerializer

try:
    # python 3
    from urllib.parse import urlencode
    from urllib.parse import parse_qs
except ImportError:
    # python 2
    from urllib import urlencode
    from urlparse import parse_qs

import re


class QueryStringSerializer(AbstractSerializer):

    def __init__(self):
        super(QueryStringSerializer, self).__init__()

    def decode(self, s, **kwargs):
        flat = kwargs.pop('flat', True)
        qs_re = r'^(([\w\-\%\+]+\=[\w\-\%\+]*)+([\&]{1})?)+'
        qs_pattern = re.compile(qs_re)
        if qs_pattern.match(s):
            data = parse_qs(s)
            if flat:
                data = {key: value[0] for key, value in data.items()}
            return data
        raise ValueError('Invalid query string: {}'.format(s))

    def encode(self, d, **kwargs):
        data = urlencode(d, **kwargs)
        return data
