from django.db import transaction
from .models import BlogView  # Or your full model import path
import logging
from django.utils import timezone
from .models import PageView
from django.contrib.auth.decorators import login_required, user_passes_test


logger = logging.getLogger(__name__)

def get_client_ip(request):
    """
    Extract client IP address from request, handling proxies
    Returns str or None if IP cannot be determined
    """
    try:
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0].strip()
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip if ip else None
    except Exception as e:
        logger.warning(f"Failed to get client IP: {str(e)}")
        return None

def track_blog_view(blog, request):
    """
    Atomically create a view tracking record
    Args:
        blog: Blog instance
        request: HttpRequest object
    Returns:
        BlogView instance if created, None if failed
    """
    try:
        with transaction.atomic():
            return BlogView.objects.create(
                blog=blog,
                ip_address=get_client_ip(request),
                user_agent=request.META.get('HTTP_USER_AGENT', '')[:255],
                session_id=request.session.session_key or ''[:100]
            )
    except Exception as e:
        logger.error(f"Failed to track blog view for {blog.id}: {str(e)}", 
                   exc_info=True)
        return None
    



def track_page_view(request, page_name):
    """
    Tracks a page view (minimal implementation)
    """
    today = timezone.now().date()
    ip_address = request.META.get('REMOTE_ADDR', '')[:45]
    session_key = request.session.session_key
    
    PageView.objects.update_or_create(
        date=today,
        page_name=page_name,
        ip_address=ip_address,
        session_key=session_key,
        defaults={'views': 1}
    )


from django.http import JsonResponse
from django.utils import timezone
from django.views.decorators.http import require_GET
from .models import PageView, SiteAnalytics
from django.db.models import Count, Sum

@login_required
@require_GET
def update_analytics(request):
    """
    URL endpoint to trigger analytics update
    Access via: /update-analytics/
    """
    date_param = request.GET.get('date')
    if date_param:
        date = timezone.datetime.strptime(date_param, '%Y-%m-%d').date()
    else:
        date = timezone.now().date()
    
    # Calculate aggregates
    views_data = PageView.objects.filter(date=date).aggregate(
        total_views=Sum('views'),
        unique_visitors=Count('ip_address', distinct=True)
    )
    
    # Update or create SiteAnalytics record
    SiteAnalytics.objects.update_or_create(
        date=date,
        defaults={
            'total_views': views_data['total_views'] or 0,
            'unique_visitors': views_data['unique_visitors'] or 0
        }
    )
    
    return JsonResponse({
        'status': 'success',
        'date': date.strftime('%Y-%m-%d'),
        'total_views': views_data['total_views'] or 0,
        'unique_visitors': views_data['unique_visitors'] or 0
    })