from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth import get_user_model
from rest_framework import generics, status
from rest_framework.exceptions import NotFound, ValidationError

from apps.permissions.models import UserCompanyRole
from apps.core.serializers.companyuserlist import UserCompanyWithRoleSerializer
from rest_framework import generics


User = get_user_model()


class SingleUserCompaniesView(generics.ListAPIView):
    """List all companies a user belongs to
    
    Usage:
    - GET /api/core/user-companies/?user_id=2 - Returns companies for user with ID 2
    
    Required Parameters:
    - user_id: ID of the user to get companies for
    """
    permission_classes = [IsAuthenticated]

    def get_target_user(self):
        """Get the target user based on query params"""
        request = self.request
        user_id = request.query_params.get('user_id')
        
        if not user_id:
            raise ValidationError("user_id parameter is required")
        
        try:
            target_user = User.objects.get(id=user_id, is_active=True)
        except User.DoesNotExist:
            raise NotFound(f"User with ID {user_id} not found")
        
        ucrs = list(
            UserCompanyRole.objects
            .filter(user=target_user, is_active=True)
            .select_related('role', 'company')
        )

        setattr(target_user, '_cached_roles', ucrs)

        return target_user

    def get_queryset(self):
        """Get all companies the target user belongs to"""
        user = self.get_target_user()
        # return user.companies.filter(is_active=True).prefetch_related('users__profile')
        return user.companies.filter().prefetch_related('users__profile')

    def list(self, request, *args, **kwargs):
        """Return list of companies with user context"""
        try:
            target_user = self.get_target_user()
        except (ValidationError, NotFound) as exc:
            return Response({
                'detail': str(exc)
            }, status=status.HTTP_400_BAD_REQUEST)
        
        queryset = self.get_queryset()
        
        serializer = UserCompanyWithRoleSerializer(
            queryset, 
            many=True,
            context={'user': target_user}
        )
        
        return Response(serializer.data)
