from django.contrib.auth.models import User
from django.core.mail import EmailMessage
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_rest_passwordreset.signals import reset_password_token_created
from django.template.loader import render_to_string
from django.urls import reverse
from knox.models import AuthToken

from core.models.profile import Profile


@receiver(post_save, sender=User)
def create_related_profile(sender, instance, created, *args, **kwargs):
    if instance and created:
        # create profile for new user
        instance.profile = Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def send_activation_email(sender, instance, created, *args, **kwargs):
    # send an e-mail to the user
    if instance and created:
        context = {
            'current_user': instance,
            'username': instance.username,
            'email': instance.email,
            'domain': 'localhost:8000',
            'token': AuthToken.objects.create(instance)[0].digest
        }

        # render email text
        email_html_message = render_to_string('email/user_verification.html', context)

        msg = EmailMessage(
            # title:
            "User Verification for {title}".format(title="Some website title"),
            # message:
            email_html_message,
            # from:
            "noreply@somehost.local",
            # to:
            [instance.email]
        )
        msg.send()

@receiver(reset_password_token_created)
def password_reset_token_created(sender, instance, reset_password_token, *args, **kwargs):
    # send an e-mail to the user
    context = {
        'current_user': reset_password_token.user,
        'username': reset_password_token.user.username,
        'email': reset_password_token.user.email,
        'reset_password_url': "{}?token={}".format(
            instance.request.build_absolute_uri(reverse('password_reset:reset-password-confirm')),
            reset_password_token.key)
    }

    # render email text
    email_html_message = render_to_string('email/user_reset_password.html', context)

    msg = EmailMessage(
        # title:
        "Password Reset for {title}".format(title="Some website title"),
        # message:
        email_html_message,
        # from:
        "noreply@somehost.local",
        # to:
        [reset_password_token.user.email]
    )
    msg.send()