from django.conf import settings
from django.db import DatabaseError

from .models import VisitorCounter


class VisitorCounterMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if self._should_track(request):
            try:
                VisitorCounter.increment_total()
            except DatabaseError:
                # Never fail page rendering when analytics counters are unavailable.
                pass

        return self.get_response(request)

    def _should_track(self, request):
        if request.method != "GET":
            return False

        path = request.path or ""
        static_prefix = f"/{str(settings.STATIC_URL).lstrip('/')}"
        media_prefix = f"/{str(settings.MEDIA_URL).lstrip('/')}"
        if path.startswith(static_prefix) or path.startswith(media_prefix):
            return False

        accept_header = request.headers.get("Accept", "")
        if not accept_header:
            return True

        return "text/html" in accept_header or "*/*" in accept_header
