from rest_framework.response import Response
from rest_framework import status
from django.utils import translation
from django.utils.translation import gettext_noop

from audits.const import ActionChoices
from common.views.mixins import RecordViewLogMixin
from common.utils import i18n_fmt


class AccountRecordViewLogMixin(RecordViewLogMixin):
    get_object: callable
    get_queryset: callable

    @staticmethod
    def _filter_params(params):
        new_params = {}
        need_pop_params = ('format', 'order')
        for key, value in params.items():
            if key in need_pop_params:
                continue
            if isinstance(value, list):
                value = list(filter(None, value))
            if value:
                new_params[key] = value
        return new_params

    def get_resource_display(self, request):
        query_params = dict(request.query_params)
        params = self._filter_params(query_params)

        spm_filter = params.pop("spm", None)

        if not params and not spm_filter:
            display_message = gettext_noop("Export all")
        elif spm_filter:
            display_message = gettext_noop("Export only selected items")
        else:
            query = ",".join(
                ["%s=%s" % (key, value) for key, value in params.items()]
            )
            display_message = i18n_fmt(gettext_noop("Export filtered: %s"), query)
        return display_message

    @property
    def detail_msg(self):
        return i18n_fmt(
            gettext_noop('User %s view/export secret'), self.request.user
        )

    def list(self, request, *args, **kwargs):
        list_func = getattr(super(), 'list')
        if not callable(list_func):
            return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
        response = list_func(request, *args, **kwargs)
        with translation.override('en'):
            resource_display = self.get_resource_display(request)
            ids = [q.id for q in self.get_queryset()]
            self.record_logs(
                ids, ActionChoices.view, self.detail_msg, resource_display=resource_display
            )
        return response

    def retrieve(self, request, *args, **kwargs):
        retrieve_func = getattr(super(), 'retrieve')
        if not callable(retrieve_func):
            return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
        response = retrieve_func(request, *args, **kwargs)
        with translation.override('en'):
            resource = self.get_object()
            self.record_logs(
                [resource.id], ActionChoices.view, self.detail_msg, resource=resource
            )
        return response