from rest_framework.response import Response
from django.contrib.auth import get_user_model
from apps.core.serializers import UserDetailSerializer, UserListDetailSerializer
from rest_framework import generics, permissions, filters, status
from django.db.models import Value, F, Count
from django.db.models.functions import Concat
from rest_framework_simplejwt.views import TokenObtainPairView
from apps.core.serializers.auth import CustomTokenObtainPairSerializer
from utils.paginations.pagination import LimitOffsetPagination


User = get_user_model()

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer

class UserDetailView(generics.RetrieveUpdateDestroyAPIView):
    """User detail api instant """
    queryset = User.objects.all()
    serializer_class = UserDetailSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get_object(self):
        return self.request.user


class UserListView(generics.ListAPIView):
    """User list api instant """
    queryset = (
        User.objects
        .annotate(
            companies_count=Count('companies'),
            full_name=Concat(F('profile__first_name'), Value(' '), F('profile__last_name'))
        ).select_related('profile').order_by('-created_at')
    )
    serializer_class = UserListDetailSerializer
    permission_classes = (permissions.IsAdminUser,)
    filter_backends = [filters.OrderingFilter, filters.SearchFilter]
    pagination_class = LimitOffsetPagination

    ordering_fields = ['full_name', 'email', 'profile__phone_number', 'companies_count', 'is_available']
    ordering = ['-created_at']

    search_fields = ['full_name', 'email', 'profile__phone_number']
