import logging
from rest_framework.response import Response
from rest_framework import status
from django.shortcuts import get_object_or_404

from django.contrib.auth import get_user_model
from rest_framework.views import APIView

from apps.companies.constants import CompanyType
from apps.core.serializers import UserDetailSerializer, UserListDetailSerializer
from rest_framework import generics, permissions, filters
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 apps.permissions.models import UserCompanyRole
from apps.permissions.permissions import CompanyPermission
from apps.permissions.services import sync_companies
from utils.paginations.pagination import LimitOffsetPagination


logger = logging.getLogger(__name__)
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']

class DeleteUserView(APIView):
    permission_classes = []

    def get_permissions(self):
        return [
            CompanyPermission('delete_dealerships_admins')
        ]

    def delete(self, request, user_id):
        print(self)
        group_admin = request.user
        dealership_admin = get_object_or_404(User, id=user_id)

        if dealership_admin == group_admin:
            return Response(
                {"detail": "You cannot delete your own membership."},
                status=status.HTTP_400_BAD_REQUEST,
            )

        group_admin_companies = group_admin.companies.filter(
            company_type = CompanyType.DEALERSHIP
        )
        dealership_admin_companies = dealership_admin.companies.filter(
            company_type = CompanyType.DEALERSHIP
        )
        common_dealerships = group_admin_companies.intersection(
            dealership_admin_companies
        ).values_list("id", flat=True)

        if not common_dealerships.exists():
            return Response(
                {"detail": "No shared companies found to remove membership from."},
                status=status.HTTP_400_BAD_REQUEST,
            )

        deleted_count, _ = UserCompanyRole.objects.filter(
            user=dealership_admin,
            company__in=common_dealerships
        ).delete()

        sync_companies(dealership_admin)

        return Response(
            {
                "detail": "User membership deleted successfully.",
                "deleted_memberships": deleted_count
            },
            status=status.HTTP_200_OK,
        )
