from django.db.models import Q
from rest_framework import permissions, status
from rest_framework.decorators import action
from rest_framework.parsers import FormParser, MultiPartParser
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet

from apps.accounts.models import User

from .models import CompanyMember
from .serializers import CompanyMemberSerializer


class CompanyMemberViewSet(ModelViewSet):
    """
    Admin-only CRUD for CompanyMember.

    Additionally exposes:
      GET  .../user-search/?q=<query>   — search system users to link
    """

    queryset = CompanyMember.objects.select_related("user").order_by("sort_order", "created_at")
    serializer_class = CompanyMemberSerializer
    parser_classes = [MultiPartParser, FormParser]

    def get_permissions(self):
        # Public read: list + retrieve (no auth needed)
        if self.action in ("list", "retrieve"):
            return [permissions.AllowAny()]
        return [permissions.IsAdminUser()]

    def get_queryset(self):
        qs = super().get_queryset()
        role_type = self.request.query_params.get("role_type", "").strip()
        if role_type:
            qs = qs.filter(role_type=role_type)
        # Non-admins only see active members
        if not (self.request.user and self.request.user.is_staff):
            qs = qs.filter(is_active=True)
        return qs

    def get_serializer_context(self):
        ctx = super().get_serializer_context()
        ctx["request"] = self.request
        return ctx

    @action(detail=False, methods=["get"], url_path="user-search", permission_classes=[permissions.IsAdminUser])
    def user_search(self, request):
        """
        Quick user search for linking a CompanyMember to a system user.
        Returns id, full_name, email, mobile, referral_code.
        """
        q = request.query_params.get("q", "").strip()
        if not q or len(q) < 2:
            return Response([], status=status.HTTP_200_OK)

        users = User.objects.filter(
            Q(first_name__icontains=q)
            | Q(last_name__icontains=q)
            | Q(email__icontains=q)
            | Q(mobile__icontains=q)
            | Q(referral_code__icontains=q)
        )[:20]

        data = [
            {
                "id": str(u.id),
                "full_name": f"{u.first_name or ''} {u.last_name or ''}".strip() or str(u),
                "email": u.email or "",
                "mobile": getattr(u, "mobile", "") or "",
                "referral_code": u.referral_code or "",
            }
            for u in users
        ]
        return Response(data, status=status.HTTP_200_OK)
