

from django.utils.deprecation import MiddlewareMixin
from .models import BlogView, BlogAnalytics, SiteAnalytics
from django.utils import timezone
from .models import Blog
# middleware.py
from django.shortcuts import redirect
from django.urls import reverse


class BlogViewTrackingMiddleware(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        # Only track views for blog detail pages
        if 'blog_id' in view_kwargs or 'guid' in view_kwargs:
            try:
                # Get the blog object based on identifier in URL
                blog_identifier = view_kwargs.get('blog_id') or view_kwargs.get('guid')
                blog = Blog.objects.get(guid=blog_identifier)
                
                # Only track views for published blogs
                if blog.status == Blog.Status.PUBLISHED:
                    # Get or create today's analytics record
                    today = timezone.now().date()
                    analytics, created = BlogAnalytics.objects.get_or_create(
                        blog=blog,
                        date=today,
                        defaults={'views': 0, 'unique_visitors': 0}
                    )
                    
                    # Create view record
                    ip_address = self.get_client_ip(request)
                    user_agent = request.META.get('HTTP_USER_AGENT', '')
                    session_id = request.session.session_key
                    
                    # Check if this is a new unique visitor
                    is_unique = not BlogView.objects.filter(
                        blog=blog,
                        ip_address=ip_address,
                        created_at__date=today
                    ).exists()
                    
                    BlogView.objects.create(
                        blog=blog,
                        ip_address=ip_address,
                        user_agent=user_agent,
                        session_id=session_id or ''
                    )
                    
                    # Update analytics
                    analytics.views += 1
                    if is_unique:
                        analytics.unique_visitors += 1
                    analytics.save()
                    
                    # Update site analytics
                    site_analytics, created = SiteAnalytics.objects.get_or_create(
                        date=today,
                        defaults={'total_views': 0, 'unique_visitors': 0}
                    )
                    site_analytics.total_views += 1
                    if is_unique:
                        site_analytics.unique_visitors += 1
                    site_analytics.save()
                    
            except Blog.DoesNotExist:
                pass
            except Exception as e:
                # Log the error but don't break the request
                import logging
                logger = logging.getLogger(__name__)
                logger.error(f"Error tracking blog view: {e}")
    
    def get_client_ip(self, request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            return x_forwarded_for.split(',')[0]
        return request.META.get('REMOTE_ADDR')
