from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator
from django.db.models import Q, F
from .models import Property, PropertyCategory, Location


def property_list(request):
    qs = Property.objects.filter(is_published=True).select_related('category', 'location')

    # Filters
    q = request.GET.get('q', '').strip()
    listing_type = request.GET.get('listing_type', '')
    category = request.GET.get('category', '')
    location = request.GET.get('location', '')
    min_price = request.GET.get('min_price', '')
    max_price = request.GET.get('max_price', '')
    bedrooms = request.GET.get('bedrooms', '')
    sort = request.GET.get('sort', '-created_at')

    if q:
        qs = qs.filter(
            Q(title__icontains=q) |
            Q(description__icontains=q) |
            Q(location__name__icontains=q) |
            Q(address__icontains=q)
        )
    if listing_type:
        qs = qs.filter(listing_type=listing_type)
    if category:
        qs = qs.filter(category__slug=category)
    if location:
        qs = qs.filter(location__slug=location)
    if min_price.isdigit():
        qs = qs.filter(price__gte=int(min_price))
    if max_price.isdigit():
        qs = qs.filter(price__lte=int(max_price))
    if bedrooms.isdigit():
        qs = qs.filter(bedrooms__gte=int(bedrooms))

    valid_sorts = ['-created_at', 'created_at', 'price', '-price', '-views_count']
    if sort in valid_sorts:
        qs = qs.order_by(sort)

    paginator = Paginator(qs, 12)
    page = paginator.get_page(request.GET.get('page'))

    return render(request, 'properties/list.html', {
        'page_obj': page,
        'categories': PropertyCategory.objects.all(),
        'locations': Location.objects.all(),
        'filters': {
            'q': q, 'listing_type': listing_type, 'category': category,
            'location': location, 'min_price': min_price, 'max_price': max_price,
            'bedrooms': bedrooms, 'sort': sort,
        },
        'total_results': paginator.count,
    })


def property_detail(request, slug):
    prop = get_object_or_404(
        Property.objects.select_related('category', 'location').prefetch_related('images', 'amenities__amenity'),
        slug=slug, is_published=True
    )
    # Increment views (atomic, no race)
    Property.objects.filter(pk=prop.pk).update(views_count=F('views_count') + 1)

    related = Property.objects.filter(
        is_published=True, category=prop.category
    ).exclude(pk=prop.pk)[:4]

    return render(request, 'properties/detail.html', {
        'property': prop,
        'related': related,
    })
