"""
Traffic Tracking Middleware
Automatically track all page views and visitors
"""
from django.utils import timezone
from .models import PageView, Visitor,  RealTimeVisitor, TrafficSource, PopularPage, DailyStats
import hashlib
from user_agents import parse
from urllib.parse import urlparse, parse_qs


class TrafficTrackerMiddleware:
    """
    Track all page views and visitor statistics
    """
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        response = self.get_response(request)
        
        # Only track successful GET requests for HTML pages
        if request.method == 'GET' and response.status_code == 200:
            # Skip admin and static URLs
            if not request.path.startswith(('/admin/', '/static/', '/media/')):
                self.track_visit(request)
        
        return response
    
    def track_visit(self, request):
        """Track the visit"""
        try:
            # Get visitor info
            ip_address = self.get_client_ip(request)
            user_agent = request.META.get('HTTP_USER_AGENT', '')
            
            # Parse user agent
            ua = parse(user_agent)
            device_type = 'mobile' if ua.is_mobile else ('tablet' if ua.is_tablet else 'desktop')
            browser = ua.browser.family
            os = ua.os.family
            
            # Get or create session
            if not request.session.session_key:
                request.session.create()
            session_id = request.session.session_key
            
            # Create visitor fingerprint
            fingerprint = hashlib.md5(
                f"{ip_address}{user_agent}".encode()
            ).hexdigest()
            
            # Get or create visitor
            visitor, created = Visitor.objects.get_or_create(
                fingerprint=fingerprint,
                defaults={
                    'ip_address': ip_address,
                    'user_agent': user_agent,
                    'device_type': device_type,
                    'browser': browser,
                    'os': os,
                }
            )
            
            if not created:
                visitor.visit_count += 1
                visitor.page_views += 1
                visitor.save(update_fields=['visit_count', 'page_views', 'last_visit'])
            
            # Associate with user if logged in
            if request.user.is_authenticated and not visitor.user:
                visitor.user = request.user
                visitor.save(update_fields=['user'])
            
            # Track page view
            PageView.objects.create(
                user=request.user if request.user.is_authenticated else None,
                session_id=session_id,
                url=request.path,
                page_title=request.path,  # Will be updated via JavaScript
                referrer=request.META.get('HTTP_REFERER', ''),
                ip_address=ip_address,
                user_agent=user_agent,
                device_type=device_type,
                browser=browser,
                os=os,
            )
            
            # Update real-time visitors
            RealTimeVisitor.objects.update_or_create(
                session_id=session_id,
                defaults={
                    'user': request.user if request.user.is_authenticated else None,
                    'current_page': request.path,
                    'ip_address': ip_address,
                    'device_type': device_type,
                    'browser': browser,
                }
            )
            
            # Track traffic source
            self.track_source(request)
            
            # Update popular pages
            self.update_popular_page(request.path)
            
            # Update daily stats
            self.update_daily_stats(device_type, created)
            
        except Exception as e:
            # Fail silently to not break site
            print(f"Traffic tracking error: {e}")
    
    def get_client_ip(self, request):
        """Get real client IP (handles proxies)"""
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip
    
    def track_source(self, request):
        """Track traffic source"""
        referrer = request.META.get('HTTP_REFERER', '')
        
        # Get UTM parameters
        utm_source = request.GET.get('utm_source', '')
        utm_medium = request.GET.get('utm_medium', '')
        utm_campaign = request.GET.get('utm_campaign', '')
        
        if utm_source or referrer:
            # Determine source type
            source_type = 'direct'
            source_name = ''
            
            if utm_medium:
                if utm_medium in ['cpc', 'ppc', 'paid']:
                    source_type = 'paid'
                elif utm_medium == 'email':
                    source_type = 'email'
                elif utm_medium in ['social', 'facebook', 'twitter', 'instagram']:
                    source_type = 'social'
            
            if referrer:
                domain = urlparse(referrer).netloc
                if 'google' in domain:
                    source_type = 'search'
                    source_name = 'Google'
                elif 'facebook' in domain or 'fb' in domain:
                    source_type = 'social'
                    source_name = 'Facebook'
                elif 'twitter' in domain or 't.co' in domain:
                    source_type = 'social'
                    source_name = 'Twitter'
                elif 'instagram' in domain:
                    source_type = 'social'
                    source_name = 'Instagram'
                elif domain:
                    source_type = 'referral'
                    source_name = domain
            
            # Update or create traffic source
            if source_type != 'direct':
                source, created = TrafficSource.objects.get_or_create(
                    source_type=source_type,
                    source_name=source_name or utm_source,
                    defaults={
                        'referrer_url': referrer,
                        'utm_source': utm_source,
                        'utm_medium': utm_medium,
                        'utm_campaign': utm_campaign,
                    }
                )
                source.visit_count += 1
                source.page_views += 1
                source.save(update_fields=['visit_count', 'page_views'])
    
    def update_popular_page(self, url):
        """Update popular pages stats"""
        page, created = PopularPage.objects.get_or_create(url=url)
        page.view_count_today += 1
        page.view_count_week += 1
        page.view_count_month += 1
        page.view_count_total += 1
        page.save()
    
    def update_daily_stats(self, device_type, is_new_visitor):
        """Update daily statistics"""
        stats = DailyStats.get_or_create_today()
        
        stats.total_page_views += 1
        
        if is_new_visitor:
            stats.new_visitors += 1
            stats.unique_visitors += 1
        
        # Update device counts
        if device_type == 'mobile':
            stats.mobile_visitors += 1
        elif device_type == 'tablet':
            stats.tablet_visitors += 1
        else:
            stats.desktop_visitors += 1
        
        stats.save()
