"""
View Mixins for Web Interface
"""
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.shortcuts import redirect
from django.conf import settings
from places.models import Category, Governorate


class LoginRequiredMixin:
    """Mixin to require login for views"""
    @method_decorator(login_required(login_url='/login/'))
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)


class PlaceContextMixin:
    """Mixin to add common place-related context"""
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = Category.objects.filter(is_active=True).order_by('name_ar')
        context['governorates'] = Governorate.objects.all().order_by('name_ar')
        context['media_url'] = settings.MEDIA_URL
        context['api_base_url'] = '/api'
        return context


class PaginationMixin:
    """Mixin for pagination"""
    paginate_by = 20
    paginate_orphans = 5


class FilterMixin:
    """Mixin for filtering and searching"""
    def get_filter_params(self):
        """Extract filter parameters from request"""
        return {
            'search': self.request.GET.get('search', ''),
            'category': self.request.GET.get('category', ''),
            'governorate': self.request.GET.get('governorate', ''),
            'min_rating': self.request.GET.get('min_rating', ''),
            'is_open': self.request.GET.get('is_open', ''),
            'has_booking': self.request.GET.get('has_booking', ''),
        }
