"""
Places Views
"""
from django.shortcuts import render, get_object_or_404
from django.db.models import Q
from places.models import Place, Category, Governorate
from config.mixins import PlaceContextMixin, FilterMixin
from config.decorators import login_required_web


def index(request):
    """Home page"""
    search_query = request.GET.get('search', '')
    category_slug = request.GET.get('category', '')
    governorate_code = request.GET.get('governorate', '')
    min_rating = request.GET.get('min_rating', '')
    
    places = Place.objects.filter(is_active=True).select_related(
        'category', 'governorate', 'owner'
    ).prefetch_related('amenities')
    
    if search_query:
        places = places.filter(
            Q(name__icontains=search_query) |
            Q(description__icontains=search_query) |
            Q(address__icontains=search_query)
        )
    
    if category_slug:
        places = places.filter(category__slug=category_slug)
    
    if governorate_code:
        places = places.filter(governorate__code=governorate_code)
    
    if min_rating:
        try:
            places = places.filter(rating__gte=float(min_rating))
        except ValueError:
            pass
    
    places = places.order_by('-rating', '-reviews_count')[:20]
    categories = Category.objects.filter(is_active=True).order_by('name_ar')
    governorates = Governorate.objects.all().order_by('name_ar')
    
    context = {
        'title': 'دليلك IQ - منصة الأماكن والخدمات في العراق',
        'description': 'اكتشف أفضل الأماكن والخدمات في العراق، احجز مواعيدك، وشارك تجربتك',
        'places': places,
        'categories': categories,
        'governorates': governorates,
        'search_query': search_query,
        'selected_category': category_slug,
        'selected_governorate': governorate_code,
        'selected_min_rating': min_rating,
    }
    return render(request, 'index.html', context)


def places_list(request):
    """Places listing page"""
    search_query = request.GET.get('search', '')
    category_slug = request.GET.get('category', '')
    governorate_code = request.GET.get('governorate', '')
    min_rating = request.GET.get('min_rating', '')
    is_open = request.GET.get('is_open', '')
    has_booking = request.GET.get('has_booking', '')
    price_range = request.GET.get('price_range', '')
    amenity_ids = request.GET.getlist('amenities', [])
    lat = request.GET.get('lat', '')
    lng = request.GET.get('lng', '')
    max_distance = request.GET.get('max_distance', '')
    ordering = request.GET.get('ordering', '-rating')
    
    places = Place.objects.filter(is_active=True).select_related(
        'category', 'governorate', 'owner'
    ).prefetch_related('amenities')
    
    if search_query:
        places = places.filter(
            Q(name__icontains=search_query) |
            Q(description__icontains=search_query) |
            Q(address__icontains=search_query)
        )
    
    if category_slug:
        places = places.filter(category__slug=category_slug)
    
    if governorate_code:
        places = places.filter(governorate__code=governorate_code)
    
    if min_rating:
        try:
            places = places.filter(rating__gte=float(min_rating))
        except ValueError:
            pass
    
    if is_open == 'true':
        places = places.filter(is_open=True)
    
    if has_booking == 'true':
        places = places.filter(has_booking=True)
    
    if price_range:
        places = places.filter(price_range=price_range)
    
    if amenity_ids:
        places = places.filter(amenities__id__in=amenity_ids).distinct()
    
    # Filter by distance if location provided
    if lat and lng and max_distance:
        try:
            from places.utils import calculate_distance
            lat = float(lat)
            lng = float(lng)
            max_distance = float(max_distance)
            
            filtered_places = []
            for place in places:
                distance = calculate_distance(
                    lat, lng,
                    float(place.latitude), float(place.longitude)
                )
                if distance <= max_distance:
                    filtered_places.append(place.id)
            
            places = places.filter(id__in=filtered_places)
        except (ValueError, TypeError):
            pass
    
    # Ordering
    valid_ordering = ['-rating', 'rating', '-reviews_count', 'reviews_count', '-created_at', 'created_at']
    if ordering in valid_ordering:
        places = places.order_by(ordering)
    else:
        places = places.order_by('-rating', '-reviews_count')
    
    categories = Category.objects.filter(is_active=True).order_by('name_ar')
    governorates = Governorate.objects.all().order_by('name_ar')
    from places.models import Amenity
    amenities = Amenity.objects.all().order_by('name_ar')
    
    context = {
        'title': 'الأماكن - دليلك IQ',
        'description': 'استكشف جميع الأماكن والخدمات في العراق',
        'places': places,
        'categories': categories,
        'governorates': governorates,
        'amenities': amenities,
        'search_query': search_query,
        'selected_category': category_slug,
        'selected_governorate': governorate_code,
        'selected_min_rating': min_rating,
        'selected_is_open': is_open,
        'selected_has_booking': has_booking,
        'selected_price_range': price_range,
        'selected_amenities': [int(a) for a in amenity_ids if a.isdigit()],
        'selected_ordering': ordering,
        'user_lat': lat,
        'user_lng': lng,
        'max_distance': max_distance,
    }
    return render(request, 'places/list.html', context)


def place_detail(request, slug):
    """Place detail page"""
    place = get_object_or_404(
        Place.objects.select_related('category', 'governorate', 'owner').prefetch_related('amenities'),
        slug=slug,
        is_active=True
    )
    
    related_places = Place.objects.filter(
        category=place.category,
        is_active=True
    ).exclude(id=place.id).order_by('-rating')[:6]
    
    context = {
        'title': f'{place.name} - دليلك IQ',
        'description': place.description or f'اكتشف {place.name} في {place.governorate.name_ar}',
        'place': place,
        'related_places': related_places,
    }
    return render(request, 'places/detail.html', context)


def place_reviews(request, slug):
    """Place reviews page"""
    place = get_object_or_404(
        Place.objects.select_related('category', 'governorate'),
        slug=slug,
        is_active=True
    )
    
    from reviews.models import Review
    reviews = Review.objects.filter(
        place=place,
        is_active=True
    ).select_related('user').order_by('-created_at')
    
    # Filter by rating if provided
    rating_filter = request.GET.get('rating')
    if rating_filter:
        try:
            reviews = reviews.filter(rating=int(rating_filter))
        except ValueError:
            pass
    
    context = {
        'title': f'تقييمات {place.name} - دليلك IQ',
        'description': f'اقرأ تقييمات المستخدمين عن {place.name}',
        'place': place,
        'reviews': reviews,
        'rating_filter': rating_filter,
    }
    return render(request, 'places/reviews.html', context)
