import csv
from weasyprint import HTML
from django.contrib import messages
from shop.models import InventoryLog, Product
from .forms import StockAdjustmentForm
from django.core.mail import send_mail
from django.conf import settings        
from django.http import HttpResponse
from django.db.models import Sum, Count
from django.template.loader import render_to_string
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404


@login_required
def stock_adjustment(request, product_id):
    product = get_object_or_404(Product, id=product_id)
    
    if request.method == 'POST':
        form = StockAdjustmentForm(request.POST)
        if form.is_valid():
            adjustment = form.save(commit=False)
            adjustment.product = product
            adjustment.previous_stock = product.stock
            adjustment.new_stock = form.cleaned_data['new_stock']
            adjustment.quantity_changed = adjustment.new_stock - adjustment.previous_stock
            adjustment.performed_by = request.user
            adjustment.save()

            # Update product stock
            product.stock = adjustment.new_stock
            product.save()

            messages.success(request, f"Stock for {product.name} updated successfully.")
            return redirect('admin:shop_product_change', product.id)
    else:
        form = StockAdjustmentForm(initial={'new_stock': product.stock})

    return render(request, 'shop/stock_adjustment.html', {
        'form': form,
        'product': product
    })
    
    

@login_required
def inventory_dashboard(request):
    low_stock = Product.objects.filter(stock__lte=10).order_by('stock')
    recent_logs = InventoryLog.objects.select_related('product').order_by('-created_at')[:20]

    # Key Metrics
    total_products = Product.objects.count()
    total_stock_value = Product.objects.aggregate(
        total=Sum('price') * Sum('stock')
    )['total'] or 0
    low_stock_count = low_stock.count()
    out_of_stock_count = low_stock.filter(stock=0).count()

    # Recent Activity
    recent_logs = InventoryLog.objects.select_related('product').order_by('-created_at')[:10]

    # Top Selling Products
    top_selling = Product.objects.annotate(
        total_sold=Sum('orderitem__quantity')
    ).order_by('-total_sold')[:5]

    context = {
        'total_products': total_products,
        'total_stock_value': total_stock_value,
        'low_stock_count': low_stock_count,
        'out_of_stock_count': out_of_stock_count,
        'recent_logs': recent_logs,
        'top_selling': top_selling,
        'low_stock_products': low_stock,
    }

    return render(request, 'shop/inventory_dashboard.html', context)


from django.core.mail import send_mail
from django.conf import settings

def send_low_stock_alert(product):
    if product.stock <= 10:
        subject = f"⚠️ Low Stock Alert: {product.name}"
        message = f"""
        Product: {product.name}
        Current Stock: {product.stock} units
        
        This product has reached the low stock threshold.
        Please restock as soon as possible.
        
        BanshiMart Admin
        """
        try:
            send_mail(
                subject=subject,
                message=message,
                from_email=settings.DEFAULT_FROM_EMAIL,
                recipient_list=[settings.ADMIN_EMAIL],  # Add ADMIN_EMAIL in settings.py
                fail_silently=False,
            )
        except Exception as e:
            print(f"Failed to send low stock alert: {e}")


@login_required
def inventory_report(request, format_type='csv'):
    products = Product.objects.all().order_by('name')
    
    if format_type == 'pdf':
        html_string = render_to_string('shop/inventory_report.html', {'products': products})
        html = HTML(string=html_string)
        pdf_bytes = html.write_pdf()
        
        response = HttpResponse(pdf_bytes, content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename="inventory_report.pdf"'
        return response
    
    # Default: CSV
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="inventory_report.csv"'
    
    writer = csv.writer(response)
    writer.writerow(['Product Name', 'Category', 'Price', 'Stock', 'Quantity Sold', 'Status'])
    
    for product in products:
        status = "Low Stock" if product.stock <= 10 else "In Stock"
        writer.writerow([
            product.name,
            product.category.name,
            product.price,
            product.stock,
            product.quantity_sold,
            status
        ])
    
    return response



