""" template filters for status interaction buttons """
from django import template

from bookwyrm import models
from bookwyrm.utils.cache import get_or_set


register = template.Library()


@register.filter(name="liked")
def get_user_liked(user, status):
    """did the given user fav a status?"""
    return get_or_set(
        f"fav-{user.id}-{status.id}",
        lambda u, s: models.Favorite.objects.filter(user=u, status=s).exists(),
        user,
        status,
        timeout=259200,
    )


@register.filter(name="boosted")
def get_user_boosted(user, status):
    """did the given user fav a status?"""
    return get_or_set(
        f"boost-{user.id}-{status.id}",
        lambda u: status.boosters.filter(user=u).exists(),
        user,
        timeout=259200,
    )


@register.filter(name="saved")
def get_user_saved_lists(user, book_list):
    """did the user save a list"""
    return user.saved_lists.filter(id=book_list.id).exists()


@register.simple_tag(takes_context=True)
def get_relationship(context, user_object):
    """caches the relationship between the logged in user and another user"""
    user = context["request"].user
    return get_or_set(
        f"cached-relationship-{user.id}-{user_object.id}",
        get_relationship_name,
        user,
        user_object,
        timeout=60 * 60,
    )


def get_relationship_name(user, user_object):
    """returns the relationship type"""
    types = {
        "is_following": False,
        "is_follow_pending": False,
        "is_blocked": False,
    }
    if user_object in user.blocks.all():
        types["is_blocked"] = True
    elif user_object in user.following.all():
        types["is_following"] = True
    elif user in user_object.follower_requests.all():
        types["is_follow_pending"] = True
    return types
