# coding=utf-8
from rest_framework.permissions import BasePermission
from rest_framework.exceptions import PermissionDenied
from tEDataProj.inter import check_user_key_inter
from AuthApp.models import User


def check_of_user_is_manager_of_company(user, view):
    if not 'pk' in view.kwargs:
        return False

    try:
        objs = User.objects.get(
            user_profile__company_obj__manager_obj=user,
            id=view.kwargs['pk']
        )
    except:
        return False

    return objs


def check_of_user_is_company_staff(user, view):
    if not 'pk' in view.kwargs:
        return False

    try:
        objs = User.objects.get(
            user_profile__company_obj=user.user_profile.company_obj,
            id=view.kwargs['pk']
        )
    except:
        return False

    return objs


class Personal_API_perms(BasePermission):
    """
    Allows access only users w full access.
    """

    def has_permission(self, request, view):

        if not request.user or request.user.is_anonymous or not request.user.is_active:
            return False

        # auth_data = request.query_params
        # if not check_user_key_inter(auth_data):
        #     raise PermissionDenied(code=403)

        user = request.user
        groups = user.groups.all()

        groups_name_list = groups.values_list('name', flat=True)

        if u'API 1С импорт' in groups_name_list:
            return False

        if view.basename == u'user':

            if view.action in ('create',):
                perm = user.has_perm('AuthApp.UI_company_staff_create')
                return perm

            if view.action in (
                    'update', 'partial_update', 'add_communication_item', 'get_connected_mailings', 'possible_mailings',
                    'change_mailing_status'):
                # perm = user.has_perm('AuthApp.UI_managers_modify')
                # return perm
                if not user.is_staff:
                    # персонал компании
                    if user.has_perm('AuthApp.UI_company_staff_modify_if_staff_company'):
                        return check_of_user_is_company_staff(user, view)

                    return False

                # если персонал
                else:
                    if check_of_user_is_manager_of_company(user, view) and user.has_perm(
                            'AuthApp.UI_company_staff_modify_if_manager'):
                        return True
                    elif user.has_perm('AuthApp.UI_company_staff_modify_any'):
                        return True

            if view.action in ('destroy',):
                perm = user.has_perm('AuthApp.UI_company_staff_delete')
                return perm

            if view.action in (
                    'retrieve', 'list', 'list_by_company_id', 'list_by_office_id',
                    'possible_departaments_list', 'possible_company_positions_list'
            ):
                perm = user.has_perm('AuthApp.UI_company_staff_retrieve_any_no_staff')
                if not perm:
                    perm = user.has_perm('AuthApp.UI_company_staff_retrieve')
                return perm

        # if view.basename == u'userprofile':
        #
        #     if view.action in ('create',):
        #         perm = user.has_perm('AuthApp.add_userprofile')
        #         return perm
        #
        #     if view.action in ('update', 'partial_update'):
        #         perm = user.has_perm('AuthApp.change_userprofile')
        #         return perm
        #
        #     if view.action in ('destroy',):
        #         perm = user.has_perm('AuthApp.delete_userprofile')
        #         return perm
        #
        #     if view.action in ('retrieve', 'list'):
        #         return True

        return False
