from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.db.models import Q, Avg
from django.http import HttpResponse, JsonResponse
from django.core.paginator import Paginator
from .models import Product, Category, Cart, CartItem, Wishlist, Review, Coupon
from django.views.decorators.cache import cache_page
import json


def home(request):
    featured_products = Product.objects.filter(is_active=True, is_featured=True)[:8]
    new_arrivals = Product.objects.filter(is_active=True, is_new_arrival=True)[:8]
    best_sellers = Product.objects.filter(is_active=True, is_best_seller=True)[:8]
    categories = Category.objects.filter(is_active=True)[:8]
    marquee_items = [
        "Fashion Forward",
        "New Arrivals",
        "Premium Quality",
        "Fast Delivery",
        "Authentic Style",
        "Best Prices",
        "Trending Now",
        "Shop Today",
        "Fashion Forward",
        "New Arrivals",
        "Premium Quality",
        "Fast Delivery",
    ]
    default_cats = [
        ("Men's Wear", "tshirt", "men"),
        ("Women's Wear", "female", "women"),
        ("Shoes", "shoe-prints", "shoes"),
        ("Accessories", "crown", "accessories"),
    ]
    context = {
        "featured_products": featured_products,
        "new_arrivals": new_arrivals,
        "best_sellers": best_sellers,
        "categories": categories,
        "marquee_items": marquee_items,
        "default_cats": default_cats,
    }
    return render(request, "store/home.html", context)


@cache_page(60 * 10)
def shop(request):
    products = Product.objects.filter(is_active=True)
    categories = Category.objects.filter(is_active=True)

    # Filters
    category_slug = request.GET.get("category")
    q = request.GET.get("q", "")
    min_price = request.GET.get("min_price")
    max_price = request.GET.get("max_price")
    sort = request.GET.get("sort", "-created_at")
    size = request.GET.get("size")

    # ✅ Fetch the actual Category object from the DB (was the bug)
    current_category_obj = None
    if category_slug:
        current_category_obj = Category.objects.filter(slug=category_slug).first()

    # ✅ SEO fields — use the object, not the undefined name 'category'
    if current_category_obj:
        seo_title = f"Buy {current_category_obj.name} Online in Nigeria | Chiez Stores"
        seo_description = (
            f"Discover our {current_category_obj.name} collection at Chiez Stores. "
            f"Affordable prices, fast nationwide delivery."
        )
    else:
        seo_title = "Shop Fashion Online Nigeria | Chiez Stores"
        seo_description = (
            "Shop affordable, stylish fashion at Chiez Stores. "
            "Clothes, shoes, bags & accessories delivered across Nigeria."
        )

    if category_slug:
        products = products.filter(category__slug=category_slug)
    if q:
        products = products.filter(Q(name__icontains=q) | Q(description__icontains=q))
        seo_title = f'Search results for "{q}" | Chiez Stores'
    if min_price:
        products = products.filter(price__gte=min_price)
    if max_price:
        products = products.filter(price__lte=max_price)
    if size:
        products = products.filter(sizes__icontains=size)

    sort_options = {
        "-created_at": "Newest",
        "price": "Price: Low to High",
        "-price": "Price: High to Low",
        "name": "Name A-Z",
    }
    products = products.order_by(sort)

    paginator = Paginator(products, 12)
    page = request.GET.get("page")
    products = paginator.get_page(page)

    # ✅ context is now defined before seo fields are added to it
    context = {
        "products": products,
        "categories": categories,
        "current_category": category_slug,
        "current_category_obj": current_category_obj,  # ✅ pass object to template too
        "query": q,
        "sort": sort,
        "sort_options": sort_options,
        "min_price": min_price,
        "max_price": max_price,
        "seo_title": seo_title,
        "seo_description": seo_description,
    }
    return render(request, "store/shop.html", context)

def product_detail(request, slug):
    product = get_object_or_404(Product, slug=slug, is_active=True)
    related = (
        Product.objects.filter(category=product.category, is_active=True)
        .exclude(id=product.id)
        .order_by("?")[:4]
    )
    reviews = product.reviews.filter(is_approved=True)

    user_review = None
    if request.user.is_authenticated:
        user_review = reviews.filter(user=request.user).first()

    if request.method == "POST" and request.user.is_authenticated:
        if not user_review:
            rating = int(request.POST.get("rating", 5))
            comment = request.POST.get("comment", "").strip()
            if comment:
                Review.objects.create(
                    product=product,
                    user=request.user,
                    rating=rating,
                    comment=comment,
                )
                messages.success(request, "Review submitted successfully!")
                return redirect("store:product_detail", slug=slug)

    context = {
        "available_sizes": ["XS", "S", "M", "L", "XL", "XXL"],
        "product": product,
        "related_products": related,
        "reviews": reviews,
        "user_review": user_review,
    }
    return render(request, "store/product_detail.html", context)


def category_view(request, slug):
    category = get_object_or_404(Category, slug=slug)
    return redirect(f"/shop/?category={slug}")


def search(request):
    return redirect(f"/shop/?q={request.GET.get('q', '')}")


# --- Cart Views ---


def get_or_create_cart(request):
    if request.user.is_authenticated:
        cart, _ = Cart.objects.get_or_create(user=request.user)
    else:
        if not request.session.session_key:
            request.session.create()
        cart, _ = Cart.objects.get_or_create(session_key=request.session.session_key)
    return cart


def cart_view(request):
    cart = get_or_create_cart(request)
    return render(request, "store/cart.html", {"cart": cart})


def add_to_cart(request, product_id):
    product = get_object_or_404(Product, id=product_id, is_active=True)
    cart = get_or_create_cart(request)

    # Use .strip() to remove accidental whitespace that causes duplicates
    size = request.POST.get("size", "").strip()
    color = request.POST.get("color", "").strip()

    try:
        quantity = int(request.POST.get("quantity", 1))
    except (ValueError, TypeError):
        quantity = 1

    # Look for an exact match including the stripped size and color
    item, created = CartItem.objects.get_or_create(
        cart=cart,
        product=product,
        size=size,
        color=color,
        defaults={"quantity": quantity},  # If creating new, set initial quantity
    )

    # If it already existed, add the new quantity to the old quantity
    if not created:
        item.quantity += quantity
        item.save()

    messages.success(request, f'"{product.name}" added to cart!')

    if request.headers.get("x-requested-with") == "XMLHttpRequest":
        return JsonResponse({"success": True, "cart_count": cart.item_count})

    return redirect(request.META.get("HTTP_REFERER", "store:cart"))


def remove_from_cart(request, item_id):
    item = get_object_or_404(CartItem, id=item_id)
    cart = get_or_create_cart(request)
    if item.cart == cart:
        item.delete()
        messages.success(request, "Item removed from cart.")
    return redirect("store:cart")


def update_cart(request, item_id):
    item = get_object_or_404(CartItem, id=item_id)
    cart = get_or_create_cart(request)
    if item.cart == cart:
        quantity = int(request.POST.get("quantity", 1))
        if quantity > 0:
            item.quantity = quantity
            item.save()
        else:
            item.delete()
    return redirect("store:cart")


def apply_coupon(request):
    if request.method == "POST":
        code = request.POST.get("coupon_code", "").strip().upper()
        cart = get_or_create_cart(request)
        try:
            coupon = Coupon.objects.get(code=code)
            if coupon.is_valid():
                if cart.total >= coupon.minimum_order:
                    cart.coupon = coupon
                    cart.save()
                    messages.success(request, f'Coupon "{code}" applied!')
                else:
                    messages.error(
                        request, f"Minimum order of ₦{coupon.minimum_order} required."
                    )
            else:
                messages.error(request, "Coupon is expired or invalid.")
        except Coupon.DoesNotExist:
            messages.error(request, "Invalid coupon code.")
    return redirect("store:cart")


def remove_coupon(request):
    cart = get_or_create_cart(request)
    cart.coupon = None
    cart.save()
    messages.success(request, "Coupon removed.")
    return redirect("store:cart")


# --- Wishlist Views ---


@login_required
def wishlist_view(request):
    wishlist, _ = Wishlist.objects.get_or_create(user=request.user)
    return render(request, "store/wishlist.html", {"wishlist": wishlist})


@login_required
def toggle_wishlist(request, product_id):
    product = get_object_or_404(Product, id=product_id)
    wishlist, _ = Wishlist.objects.get_or_create(user=request.user)
    if product in wishlist.products.all():
        wishlist.products.remove(product)
        in_wishlist = False
        messages.info(request, f'"{product.name}" removed from wishlist.')
    else:
        wishlist.products.add(product)
        in_wishlist = True
        messages.success(request, f'"{product.name}" added to wishlist!')

    if request.headers.get("x-requested-with") == "XMLHttpRequest":
        return JsonResponse({"success": True, "in_wishlist": in_wishlist})

    next_url = request.POST.get("next") or request.GET.get("next") or "store:wishlist"
    return redirect(next_url)


def about(request):
    return render(request, "store/about.html")


def contact(request):
    if request.method == "POST":
        messages.success(
            request, "Message sent! We'll get back to you within 24 hours."
        )
        return redirect("store:contact")
    return render(request, "store/contact.html")


def faq(request):
    return render(request, "store/faq.html")


def robots_txt(request):
    lines = [
        "User-agent: *",
        "Allow: /",
        "Disallow: /dashboard/",
        "Disallow: /admin/",
        "Disallow: /orders/checkout/",
        "Disallow: /cart/",
        f"Sitemap: {request.scheme}://{request.get_host()}/sitemap.xml",
    ]
    return HttpResponse("\n".join(lines), content_type="text/plain")
