import urlparse
import urllib

from django.contrib import messages
from django.http import HttpResponseRedirect

class RequestMessagesMiddleware:
    """
    A middleware that checks for specific get parameters in url, appends
    associated messages and redirects to the same url (removing the parameter
    to avoid circular redirects).
    """

    PARAMS_MAP = {
        'logged_in': ((messages.SUCCESS, 'You have successfully logged in'),),
        'logged_out': ((messages.SUCCESS, 'You have successfully logged out'),),
    }

    def process_request(self, request):
        qs = request.META.get('QUERY_STRING', '')
        if not qs:
            return

        qs = urlparse.parse_qs(qs)

        # parse query string, add messages and keep params used to remove
        # them later from the redirect url
        params_to_remove = []
        for param, messages_tuples in self.PARAMS_MAP.iteritems():
            if param in qs:
                params_to_remove.append(param)
                for message in messages_tuples:
                    msg_type = message[0]
                    msg = message[1]
                    messages.add_message(request, msg_type, msg)

        if not params_to_remove:
            return

        for p in params_to_remove:
            del qs[p]

        # create the redirect url
        redirect_qs = urllib.urlencode(qs)

        return HttpResponseRedirect("/?" + redirect_qs)

