from django.core.mail import EmailMultiAlternatives
from django.dispatch import receiver
from django.template.loader import render_to_string
from decouple import config
from django_rest_passwordreset.signals import reset_password_token_created
from django.db.models.signals import post_save
from api.models import User
from django.contrib.auth.models import Permission


@receiver(post_save, sender=User)
def assign_device_permissions(sender, instance, created, **kwargs):
    if created:
        # Assign all permissions for devices and read permission for atoll and island
        device_permissions = Permission.objects.filter(content_type__model="device")
        atoll_read_permission = Permission.objects.get(codename="view_atoll")
        island_read_permission = Permission.objects.get(codename="view_island")
        payment_permissions = Permission.objects.filter(
            content_type__model="payment"
        ).exclude(codename="delete_payment")

        for permission in device_permissions:
            instance.user_permissions.add(permission)
        instance.user_permissions.add(atoll_read_permission, island_read_permission)
        for permission in payment_permissions:
            instance.user_permissions.add(permission)


@receiver(reset_password_token_created)
def password_reset_token_created(
    sender, instance, reset_password_token, *args, **kwargs
):
    """
    Handles password reset tokens
    When a token is created, an e-mail needs to be sent to the user
    :param sender: View Class that sent the signal
    :param instance: View Instance that sent the signal
    :param reset_password_token: Token Model Object
    :param args:
    :param kwargs:
    :return:
    """
    context = {
        "current_user": reset_password_token.user,
        "username": reset_password_token.user.username,
        "email": reset_password_token.user.email,
        "reset_password_url": f"{config('FRONTEND_URL')}/auth/reset-password-confirm/?token={reset_password_token.key}",
    }

    # render email text
    email_html_message = render_to_string("email/password_reset_email.html", context)
    email_plaintext_message = (
        f"Here is your password reset link: {context['reset_password_url']}"
    )

    msg = EmailMultiAlternatives(
        # title:
        "Password Reset for {title}".format(title="Sarlink Portal"),
        # message:
        email_plaintext_message,  # This is the plaintext version
        # from:
        "noreply@sarlink.net",
        # to:
        [reset_password_token.user.email],
    )
    msg.attach_alternative(email_html_message, "text/html")
    msg.send()