from django.conf import settings
from rest_framework.request import Request

from assets.pagination import AssetPaginationBase
from perms.models import UserAssetGrantedTreeNodeRelation
from common.utils import get_logger

logger = get_logger(__name__)


class GrantedAssetPaginationBase(AssetPaginationBase):
    _user: object

    def init_attrs(self, queryset, request: Request, view=None):
        super().init_attrs(queryset, request, view)
        self._user = view.user


class NodePermedAssetPagination(GrantedAssetPaginationBase):
    def get_count_from_nodes(self, queryset):
        node = getattr(self._view, 'pagination_node', None)
        if node:
            logger.debug(f'Hit node.assets_amount[{node.assets_amount}] -> '
                         f'{self._request.get_full_path()}')
            return node.assets_amount
        else:
            logger.warn(f'Not hit node.assets_amount[{node}] because {self._view} '
                        f'not has `pagination_node` -> {self._request.get_full_path()}')
            return None


class AllPermedAssetPagination(GrantedAssetPaginationBase):
    def get_count_from_nodes(self, queryset):
        if settings.PERM_SINGLE_ASSET_TO_UNGROUP_NODE:
            return None
        values = UserAssetGrantedTreeNodeRelation.objects.filter(
            user=self._user, node_parent_key=''
        ).values_list('node_assets_amount', flat=True)
        if not values:
            return None

        assets_amount = sum(values)
        logger.debug(f'Hit all assets amount {assets_amount} -> {self._request.get_full_path()}')
        return assets_amount