from django.db.models.signals import pre_save, post_save
from django.dispatch import receiver
from allauth.account.signals import *
from .models import *
from django.contrib.auth.models import Group, User
import logging
db_logger = logging.getLogger('db')
from django.contrib.auth.signals import *
from django.dispatch import Signal
from django_currentuser.middleware import get_current_user, get_current_authenticated_user
from users.roles import AuthenticatedUser
from rolepermissions.checkers import has_permission, has_role


# helper function
def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip


@receiver(email_confirmed)
def email_confirmed_(request, email_address, **kwargs):
    user = UserModel.objects.get(email=email_address.email)
    user.is_active = True
    user.save()


@receiver(user_logged_in)
def login_sucess(request, user, **kwargs):
    try:
        print('login successful')

        user_agent_info = request.META.get('HTTP_USER_AGENT',
                                           '<unknown>')[:255],
        user_login_activity_log = UserLoginActivity(
            login_IP=get_client_ip(request),
            login_username=user.email,
            user_agent_info=user_agent_info,
            status=UserLoginActivity.SUCCESS)
        user_login_activity_log.save()

        from rolepermissions.roles import assign_role
        assign_role(user, AuthenticatedUser)
        user.save()
        print(has_role(user, AuthenticatedUser))
    except Exception as e:
        db_logger.exception(e)
        db_logger.error("log_user_logged_in request: %s, error: %s" %
                        (request, e))
        print(e)


@receiver(user_logged_out)
def log_out_success(request, user, **kwargs):
    try:
        print('User logging out')

    except Exception as e:
        db_logger.exception(e)


@receiver(user_signed_up)
def signed_up_sucess(request, user, **kwargs):
    try:
        print('Sign up successful')
        # give user authenticated user privileges over users objects
        g1 = Group.objects.get(name="anonymouseUser")
        g2 = Group.objects.get(name="authenticatedUser")
        user.groups.add(g1)
        user.groups.add(g2)
        user.save()
    except Exception as e:
        db_logger.exception(e)


# @receiver(user_login_failed)
# def log_user_logged_in_failed(sender, credentials, request, **kwargs):
#     try:
#         user_agent_info = request.META.get('HTTP_USER_AGENT',
#                                            '<unknown>')[:255],
#         user_login_activity_log = UserLoginActivity(
#             login_IP=get_client_ip(request),
#             login_username=credentials['username'],
#             user_agent_info=user_agent_info,
#             status=UserLoginActivity.FAILED)
#         user_login_activity_log.save()
#     except Exception as e:
#         # log the error
#         db_logger.error("log_user_logged_in request: %s, error: %s" %
#                         (request, e))


@receiver(password_set)
def password_created(request, user, **kwargs):
    pass


@receiver(password_changed)
def password_changed_sucess(request, user, **kwargs):
    pass


@receiver(password_reset)
def password_reset_(request, user, **kwargs):
    pass


@receiver(email_confirmation_sent)
def email_confirmation_sent_(request, confirmation, signup, **kwargs):
    pass


@receiver(email_changed)
def email_change_sucess(request, user, from_email_address, to_email_address,
                        **kwargs):
    pass


@receiver(email_added)
def new_email_created(request, user, email_address, **kwargs):
    pass


@receiver(email_removed)
def email_deleted(request, user, email_address, **kwargs):
    pass
