
import json
from datetime import datetime, timedelta
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.db.models import Count, Sum, Q, F
from django.utils import timezone
from django.contrib import messages
from django.core.paginator import Paginator
from django.contrib.auth.models import User
from .models import SiteTraffic, ProductAnalytics, Banner, UserSession, ShopSettings
from shop.models import Order, Cart, ShippingMethod
from inventory.models import Product
from settings.models import Shop
from customers.models import Customer
from .forms import BannerForm, ShopSettingsForm
from shop.forms import ShippingMethodForm


@login_required
def ecommerce_dashboard(request):
    """Main ecommerce dashboard with analytics"""
    today = timezone.now().date()
    last_30_days = today - timedelta(days=30)
    
    # Customer Analytics
    total_customers = User.objects.filter(groups__name='Customer').count()
    customers_online = UserSession.objects.filter(
        last_activity__gte=timezone.now() - timedelta(minutes=30),
        user__groups__name='Customer'
    ).count()
    new_customers_today = User.objects.filter(
        groups__name='Customer',
        date_joined__date=today
    ).count()
    
    # Site Traffic
    traffic_today = SiteTraffic.objects.filter(date=today).first()
    traffic_aggregates = SiteTraffic.objects.filter(
        date__gte=last_30_days
    ).aggregate(
        total_views=Sum('page_views'),
        total_visitors=Sum('unique_visitors'),
        total_bounce_rate=Sum('bounce_rate'),
        record_count=Count('date')
    )
    
    # Calculate average bounce rate safely
    traffic_last_30_days = {
        'total_views': traffic_aggregates['total_views'] or 0,
        'total_visitors': traffic_aggregates['total_visitors'] or 0,
        'avg_bounce_rate': (
            traffic_aggregates['total_bounce_rate'] / traffic_aggregates['record_count']
            if traffic_aggregates['record_count'] and traffic_aggregates['record_count'] > 0
            else 0
        )
    }
    
    # Product Performance (Top 10 by clicks)
    top_products = ProductAnalytics.objects.filter(
        date__gte=last_30_days
    ).values(
        'product__name', 'product__id'
    ).annotate(
        total_views=Sum('views'),
        total_clicks=Sum('clicks'),
        total_purchases=Sum('purchases'),
        total_revenue=Sum('revenue')
    ).order_by('-total_clicks')[:10]
    
    # Order Analytics
    orders_new = Order.objects.filter(status='Pending').count()
    orders_processing = Order.objects.filter(status='Processing').count()
    orders_shipped = Order.objects.filter(status='Shipped').count()
    orders_delivered = Order.objects.filter(status='Delivered').count()
    orders_cancelled = Order.objects.filter(status='Cancelled').count()
    
    # Recent Orders
    recent_orders = Order.objects.all().order_by('-created_at')[:10]
    
    # Revenue Analytics
    revenue_today = Order.objects.filter(
        created_at__date=today,
        status__in=['Processing', 'Shipped', 'Delivered']
    ).aggregate(total=Sum('total_price'))['total'] or 0
    
    revenue_last_30_days = Order.objects.filter(
        created_at__date__gte=last_30_days,
        status__in=['Processing', 'Shipped', 'Delivered']
    ).aggregate(total=Sum('total_price'))['total'] or 0
    
    # Active Banners
    active_banners = Banner.objects.filter(is_active=True).count()
    
    context = {
        'total_customers': total_customers,
        'customers_online': customers_online,
        'new_customers_today': new_customers_today,
        'traffic_today': traffic_today,
        'traffic_last_30_days': traffic_last_30_days,
        'top_products': top_products,
        'orders_new': orders_new,
        'orders_processing': orders_processing,
        'orders_shipped': orders_shipped,
        'orders_delivered': orders_delivered,
        'orders_cancelled': orders_cancelled,
        'recent_orders': recent_orders,
        'revenue_today': revenue_today,
        'revenue_last_30_days': revenue_last_30_days,
        'active_banners': active_banners,
    }
    
    return render(request, 'shop_backend/ecommerce_dashboard.html', context)


@login_required
def banner_list(request):
    """List all banners"""
    banners = Banner.objects.all().order_by('placement', 'display_order')
    paginator = Paginator(banners, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    return render(request, 'shop_backend/banner_list.html', {'banners': page_obj})


@login_required
def banner_create(request):
    """Create a new banner"""
    if request.method == 'POST':
        form = BannerForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.success(request, 'Banner created successfully!')
            return redirect('shop_backend:banner_list')
    else:
        form = BannerForm()
    
    return render(request, 'shop_backend/banner_form.html', {
        'form': form,
        'title': 'Create Banner'
    })


@login_required
def banner_edit(request, banner_id):
    """Edit an existing banner"""
    banner = get_object_or_404(Banner, id=banner_id)
    
    if request.method == 'POST':
        form = BannerForm(request.POST, request.FILES, instance=banner)
        if form.is_valid():
            form.save()
            messages.success(request, 'Banner updated successfully!')
            return redirect('shop_backend:banner_list')
    else:
        form = BannerForm(instance=banner)
    
    return render(request, 'shop_backend/banner_form.html', {
        'form': form,
        'banner': banner,
        'title': 'Edit Banner'
    })


@login_required
def banner_delete(request, banner_id):
    """Delete a banner"""
    banner = get_object_or_404(Banner, id=banner_id)
    
    if request.method == 'POST':
        banner.delete()
        messages.success(request, 'Banner deleted successfully!')
        return redirect('shop_backend:banner_list')
    
    return render(request, 'shop_backend/banner_confirm_delete.html', {'banner': banner})


@login_required
def shop_settings(request):
    """Edit shop settings including tagline"""
    shop = Shop.objects.first()
    if not shop:
        messages.error(request, 'No shop configuration found. Please create one first.')
        return redirect('shop_backend:ecommerce_dashboard')
    
    shop_settings, created = ShopSettings.objects.get_or_create(shop=shop)
    
    if request.method == 'POST':
        form = ShopSettingsForm(request.POST, instance=shop_settings)
        if form.is_valid():
            form.save()
            messages.success(request, 'Shop settings updated successfully!')
            return redirect('shop_backend:shop_settings')
    else:
        form = ShopSettingsForm(instance=shop_settings)
    
    return render(request, 'shop_backend/shop_settings.html', {
        'form': form,
        'shop': shop,
        'shop_settings': shop_settings
    })


@login_required
def analytics_api(request):
    """API endpoint for analytics data"""
    days = int(request.GET.get('days', 30))
    end_date = timezone.now().date()
    start_date = end_date - timedelta(days=days)
    
    # Traffic data
    traffic_data = list(SiteTraffic.objects.filter(
        date__gte=start_date,
        date__lte=end_date
    ).values('date', 'page_views', 'unique_visitors'))
    
    # Order data
    order_data = list(Order.objects.filter(
        created_at__date__gte=start_date,
        created_at__date__lte=end_date
    ).extra(
        select={'date': 'DATE(created_at)'}
    ).values('date').annotate(
        count=Count('id'),
        revenue=Sum('total_price')
    ))
    
    return JsonResponse({
        'traffic': traffic_data,
        'orders': order_data
    })


@login_required
def product_analytics(request):
    """Product analytics dashboard"""
    days = int(request.GET.get('days', 30))
    end_date = timezone.now().date()
    start_date = end_date - timedelta(days=days)
    
    # Product performance data
    products = ProductAnalytics.objects.filter(
        date__gte=start_date,
        date__lte=end_date
    ).values(
        'product__name', 'product__id', 'product__image'
    ).annotate(
        total_views=Sum('views'),
        total_clicks=Sum('clicks'),
        total_cart_additions=Sum('cart_additions'),
        total_purchases=Sum('purchases'),
        total_revenue=Sum('revenue'),
        conversion_rate=F('total_purchases') * 100.0 / F('total_clicks')
    ).order_by('-total_clicks')[:20]
    
    return render(request, 'shop_backend/product_analytics.html', {
        'products': products,
        'days': days
    })


@login_required
def shipping_methods_list(request):
    """API endpoint to list all shipping methods"""
    methods = ShippingMethod.objects.all().values(
        'id', 'name', 'description', 'cost', 'is_active'
    )
    return JsonResponse({'methods': list(methods)})


@login_required
def shipping_method_create(request):
    """Create a new shipping method via AJAX"""
    if request.method == 'POST':
        form = ShippingMethodForm(request.POST)
        if form.is_valid():
            form.save()
            return JsonResponse({'success': True, 'message': 'Shipping method created successfully'})
        else:
            return JsonResponse({'success': False, 'message': 'Form validation failed'})
    return JsonResponse({'success': False, 'message': 'Invalid request method'})


@login_required
def shipping_method_edit(request, method_id):
    """Edit an existing shipping method via AJAX"""
    method = get_object_or_404(ShippingMethod, id=method_id)
    
    if request.method == 'POST':
        form = ShippingMethodForm(request.POST, instance=method)
        if form.is_valid():
            form.save()
            return JsonResponse({'success': True, 'message': 'Shipping method updated successfully'})
        else:
            return JsonResponse({'success': False, 'message': 'Form validation failed'})
    return JsonResponse({'success': False, 'message': 'Invalid request method'})


@login_required
def shipping_method_delete(request, method_id):
    """Delete a shipping method via AJAX"""
    method = get_object_or_404(ShippingMethod, id=method_id)
    
    if request.method == 'POST':
        method.delete()
        return JsonResponse({'success': True, 'message': 'Shipping method deleted successfully'})
    return JsonResponse({'success': False, 'message': 'Invalid request method'})
