from datetime import datetime, timedelta
import re

from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from .models import User


class ReferrerMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if 'ref' in request.GET:
            id = request.GET['ref']
        elif 'referrer' in request.COOKIES:
            id = request.COOKIES['referrer']
        else:
            return

        try:
            id = int(id.strip())
        except (ValueError, TypeError):
            return

        try:
            u = User.objects.get(id=id)
        except User.DoesNotExist:
            return

        request.session['referrer'] = u.id

    def process_response(self, request, response):
        id = request.session.get('referrer')
        if not id:
            return response

        max_age = 365 * 24 * 60 * 60
        expires = (datetime.utcnow() + timedelta(seconds=max_age))
        expires = expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
        response.set_cookie('referrer', id,
                            max_age=max_age,
                            expires=expires,
                            domain=settings.SESSION_COOKIE_DOMAIN,
                            secure=settings.SESSION_COOKIE_SECURE or None)
        return response


class CampaignMiddleware(MiddlewareMixin):
    GET_FIELDS = ['pk_campaign', 'utm_campaign', 'utm_medium', 'utm_source']

    def _get_name(self, request):
        for f in self.GET_FIELDS:
            if f in request.GET and request.GET[f]:
                return request.GET[f]
        if 'campaign' in request.COOKIES:
            return request.COOKIES['campaign']
        return None

    def process_request(self, request):
        name = self._get_name(request)
        if not name:
            return

        name = name.strip()

        if len(name) >= 64 or not re.match('^[a-zA-Z0-9_.:-]+$', name):
            return

        request.session['campaign'] = name

    def process_response(self, request, response):
        name = request.session.get('campaign')
        if not name:
            return response

        max_age = 365 * 24 * 60 * 60
        expires = (datetime.utcnow() + timedelta(seconds=max_age))
        expires = expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
        response.set_cookie('campaign', name,
                            max_age=max_age,
                            expires=expires,
                            domain=settings.SESSION_COOKIE_DOMAIN,
                            secure=settings.SESSION_COOKIE_SECURE or None)
        return response
