from django.utils import timezone
from django.contrib import messages
from .models import EntertainmentBrand
from .forms import EntertainmentBrandForm
from django.views.decorators.http import require_POST
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required, user_passes_test


def staff_required(view_func):
    return user_passes_test(lambda u: u.is_staff)(view_func)


@login_required
def brand_list(request):
    """Public list of trusted brands"""
    brands = EntertainmentBrand.objects.filter(
        is_active=True,
        status=EntertainmentBrand.Status.TRUSTED,
        is_verified=True
    ).order_by("display_order", "name")

    featured_brands = brands.filter(is_featured=True)[:6]

    return render(request, "brands/brand_list.html", {
        "brands": brands,
        "featured_brands": featured_brands,
    })


@login_required
def brand_detail(request, slug):
    """Brand detail page"""
    brand = get_object_or_404(
        EntertainmentBrand,
        slug=slug,
        is_active=True,
        status=EntertainmentBrand.Status.TRUSTED
    )
    return render(request, "brands/brand_detail.html", {
        "brand": brand
    })


# ==================== ADMIN VIEWS ====================

@staff_required
def admin_brand_list(request):
    """Admin list of all brands"""
    brands = EntertainmentBrand.objects.all()
    
    print(brands)
    
    stats = {
        "total": brands.count(),
        "trusted": brands.filter(status=EntertainmentBrand.Status.TRUSTED).count() or None,
        "pending": brands.filter(status=EntertainmentBrand.Status.PENDING).count() or None,
        "featured": brands.filter(is_featured=True).count() or None,
    }

    print(stats)
    return render(request, "brands/admin_brand_list.html", {
        "brands": brands,
        "stats": stats,
    })


def staff_required(view_func):
    return user_passes_test(lambda u: u.is_staff)(view_func)


@staff_required
def brand_create(request):
    if request.method == "POST":
        form = EntertainmentBrandForm(request.POST, request.FILES)
        if form.is_valid():
            brand = form.save()
            messages.success(request, f"Brand '{brand.name}' created successfully.")
            return redirect("core:admin_brand_list")
    else:
        form = EntertainmentBrandForm()

    return render(request, "brands/brand_form.html", {
        "form": form,
        "title": "Add New Brand",
        "submit_label": "Create Brand",
    })


@staff_required
def brand_edit(request, brand_id):
    brand = get_object_or_404(EntertainmentBrand, pk=brand_id)

    if request.method == "POST":
        form = EntertainmentBrandForm(request.POST, request.FILES, instance=brand)
        if form.is_valid():
            brand = form.save()
            messages.success(request, f"Brand '{brand.name}' updated successfully.")
            return redirect("core:admin_brand_list")
    else:
        form = EntertainmentBrandForm(instance=brand)

    return render(request, "brands/brand_form.html", {
        "form": form,
        "brand": brand,
        "title": f"Edit {brand.name}",
        "submit_label": "Save Changes",
    })
    
    
@staff_required
@require_POST
def approve_brand(request, brand_id):
    brand = get_object_or_404(EntertainmentBrand, pk=brand_id)
    brand.status = EntertainmentBrand.Status.TRUSTED
    brand.is_verified = True
    brand.verified_at = timezone.now()
    brand.save()
    
    messages.success(request, f"{brand.name} has been approved and marked as Trusted.")
    return redirect("core:admin_brand_list")


@staff_required
@require_POST
def reject_brand(request, brand_id):
    brand = get_object_or_404(EntertainmentBrand, pk=brand_id)
    brand.status = EntertainmentBrand.Status.REJECTED
    brand.is_verified = False
    brand.save()
    
    messages.warning(request, f"{brand.name} has been rejected.")
    return redirect("core:admin_brand_list")


@staff_required
@require_POST
def toggle_featured(request, brand_id):
    brand = get_object_or_404(EntertainmentBrand, pk=brand_id)
    brand.is_featured = not brand.is_featured
    brand.save()
    
    status = "featured" if brand.is_featured else "unfeatured"
    messages.info(request, f"{brand.name} has been {status}.")
    return redirect("core:admin_brand_list")