from __future__ import absolute_import, unicode_literals

from collections import OrderedDict

from django.utils.translation import ugettext_lazy as _

from debug_toolbar.panels import Panel


class HeadersPanel(Panel):
    """
    A panel to display HTTP headers.
    """
    # List of environment variables we want to display
    ENVIRON_FILTER = set((
        'CONTENT_LENGTH',
        'CONTENT_TYPE',
        'DJANGO_SETTINGS_MODULE',
        'GATEWAY_INTERFACE',
        'QUERY_STRING',
        'PATH_INFO',
        'PYTHONPATH',
        'REMOTE_ADDR',
        'REMOTE_HOST',
        'REQUEST_METHOD',
        'SCRIPT_NAME',
        'SERVER_NAME',
        'SERVER_PORT',
        'SERVER_PROTOCOL',
        'SERVER_SOFTWARE',
        'TZ',
    ))

    title = _("Headers")

    template = 'debug_toolbar/panels/headers.html'

    def process_request(self, request):
        wsgi_env = list(sorted(request.META.items()))
        self.request_headers = OrderedDict(
            (unmangle(k), v) for (k, v) in wsgi_env if is_http_header(k))
        if 'Cookie' in self.request_headers:
            self.request_headers['Cookie'] = '=> see Request panel'
        self.environ = OrderedDict(
            (k, v) for (k, v) in wsgi_env if k in self.ENVIRON_FILTER)
        self.record_stats({
            'request_headers': self.request_headers,
            'environ': self.environ,
        })

    def generate_stats(self, request, response):
        self.response_headers = OrderedDict(sorted(response.items()))
        self.record_stats({
            'response_headers': self.response_headers,
        })


def is_http_header(wsgi_key):
    # The WSGI spec says that keys should be str objects in the environ dict,
    # but this isn't true in practice. See issues #449 and #482.
    return isinstance(wsgi_key, str) and wsgi_key.startswith('HTTP_')


def unmangle(wsgi_key):
    return wsgi_key[5:].replace('_', '-').title()
