from rest_framework import status
from rest_framework.viewsets import ModelViewSet
from drf_spectacular.utils import extend_schema
from django.db.models import Q

from core.responses import success_response
from core.permissions import DjangoModelPermissionsWithView, IsAdmin
from .models import Client, CompanyLinkedInConfig
from .serializers import ClientSerializer, CompanyLinkedInConfigSerializer


class CompanyLinkedInConfigViewSet(ModelViewSet):
    """Admin CRUD for per-company LinkedIn posting credentials."""
    queryset = CompanyLinkedInConfig.objects.select_related("client").all()
    serializer_class = CompanyLinkedInConfigSerializer
    permission_classes = [IsAdmin]

    def list(self, request, *args, **kwargs):
        return success_response(self.get_serializer(self.get_queryset(), many=True).data)

    def create(self, request, *args, **kwargs):
        s = self.get_serializer(data=request.data); s.is_valid(raise_exception=True); s.save()
        return success_response(s.data, "LinkedIn config saved.", status_code=status.HTTP_201_CREATED)

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop("partial", False)
        s = self.get_serializer(self.get_object(), data=request.data, partial=partial)
        s.is_valid(raise_exception=True); s.save()
        return success_response(s.data, "LinkedIn config updated.")

    def destroy(self, request, *args, **kwargs):
        self.get_object().delete()
        return success_response(None, "LinkedIn config removed.")


class ClientViewSet(ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer
    permission_classes = [DjangoModelPermissionsWithView]

    def get_serializer_class(self):
        # Mask phone/email in the bulk list; full values in detail/create/update.
        if self.action == "list":
            from .serializers import ClientListSerializer
            return ClientListSerializer
        return ClientSerializer

    def get_queryset(self):
        qs = super().get_queryset()
        search = self.request.query_params.get("search")
        if search:
            qs = qs.filter(
                Q(name__icontains=search)
                | Q(email__icontains=search)
                | Q(phone__icontains=search)
                | Q(website__icontains=search)
            )
        return qs.order_by("name")


    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return success_response(serializer.data)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return success_response(
            serializer.data,
            "Client created successfully",
            status_code=status.HTTP_201_CREATED
        )

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop("partial", False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return success_response(serializer.data, "Client updated successfully")

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.delete()
        return success_response(None, "Client deleted successfully")
