"""
PREPOC ERP — ViewSet Mixins
"""
from rest_framework import status
from rest_framework.response import Response

from core.utils.audit import log_activity


class OrganizationQuerySetMixin:
    """
    Automatically scopes querysets to the request's organization.
    Must be used with views that have request.organization set.
    """

    def get_queryset(self):
        qs = super().get_queryset()
        if hasattr(self.request, "organization"):
            qs = qs.filter(organization=self.request.organization)
        return qs


class SoftDeleteMixin:
    """Override destroy() to perform soft delete."""

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.delete(deleted_by=request.user)
        return Response(status=status.HTTP_204_NO_CONTENT)


class AuditMixin:
    """Auto-log create/update/delete actions to ActivityLog."""

    def perform_create(self, serializer):
        instance = serializer.save(
            created_by=self.request.user,
            organization=self.request.organization,
        )
        log_activity(
            user=self.request.user,
            organization=self.request.organization,
            action="CREATE",
            obj=instance,
            request=self.request,
        )

    def perform_update(self, serializer):
        instance = serializer.save(updated_by=self.request.user)
        log_activity(
            user=self.request.user,
            organization=self.request.organization,
            action="UPDATE",
            obj=instance,
            request=self.request,
        )

    def perform_destroy(self, instance):
        log_activity(
            user=self.request.user,
            organization=self.request.organization,
            action="DELETE",
            obj=instance,
            request=self.request,
        )
        instance.delete(deleted_by=self.request.user)


class BulkDeleteMixin:
    """Add bulk_delete action to ViewSets."""

    from rest_framework.decorators import action

    @action(detail=False, methods=["post"], url_path="bulk-delete")
    def bulk_delete(self, request):
        ids = request.data.get("ids", [])
        if not ids:
            return Response(
                {"detail": "No IDs provided."},
                status=status.HTTP_400_BAD_REQUEST,
            )
        qs = self.get_queryset().filter(id__in=ids)
        count = qs.count()
        qs.delete(deleted_by=request.user)
        return Response({"deleted": count}, status=status.HTTP_200_OK)


class ExportMixin:
    """Add PDF and Excel export actions."""

    from rest_framework.decorators import action

    @action(detail=False, methods=["get"], url_path="export/excel")
    def export_excel(self, request):
        from core.utils.exports import export_to_excel
        qs = self.filter_queryset(self.get_queryset())
        return export_to_excel(qs, self.get_serializer_class())

    @action(detail=True, methods=["get"], url_path="export/pdf")
    def export_pdf(self, request, pk=None):
        from core.utils.exports import export_to_pdf
        instance = self.get_object()
        return export_to_pdf(instance)
