from cryptography.fernet import Fernet

from django.conf import settings
from django.db.models import OuterRef, Count, Subquery, IntegerField
from django.db.models.functions import Coalesce

from chat_box.models import Ignore, Message, UserRoom

secret_key = settings.CHAT_SECRET_KEY
fernet = Fernet(secret_key)


def encrypt_url(creator_id, other_id):
    message = str(creator_id) + "_" + str(other_id)
    return fernet.encrypt(message.encode()).decode()


def decrypt_url(message_encrypted):
    try:
        dec_message = fernet.decrypt(message_encrypted.encode()).decode()
        creator_id, other_id = dec_message.split("_")
        return int(creator_id), int(other_id)
    except Exception as e:
        return None, None


def get_unread_boxes(profile):
    ignored_users = Ignore.get_ignored_users(profile)

    mess = (
        Message.objects.filter(room=OuterRef("room"), time__gte=OuterRef("last_seen"))
        .exclude(author=profile)
        .exclude(author__in=ignored_users)
        .order_by()
        .values("room")
        .annotate(unread_count=Count("pk"))
        .values("unread_count")
    )

    unread_boxes = (
        UserRoom.objects.filter(user=profile, room__isnull=False)
        .annotate(
            unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0),
        )
        .filter(unread_count__gte=1)
        .count()
    )

    return unread_boxes