""" like/fav/star a status """
from django.apps import apps
from django.db import models
from django.utils import timezone

from bookwyrm import activitypub
from .activitypub_mixin import ActivityMixin
from .base_model import BookWyrmModel
from . import fields
from .status import Status


class Favorite(ActivityMixin, BookWyrmModel):
    """ fav'ing a post """

    user = fields.ForeignKey(
        "User", on_delete=models.PROTECT, activitypub_field="actor"
    )
    status = fields.ForeignKey(
        "Status", on_delete=models.PROTECT, activitypub_field="object"
    )

    activity_serializer = activitypub.Like

    @classmethod
    def ignore_activity(cls, activity):
        """ don't bother with incoming favs of unknown statuses """
        return not Status.objects.filter(remote_id=activity.object).exists()

    def save(self, *args, **kwargs):
        """ update user active time """
        self.user.last_active_date = timezone.now()
        self.user.save(broadcast=False)
        super().save(*args, **kwargs)

        if self.status.user.local and self.status.user != self.user:
            notification_model = apps.get_model(
                "bookwyrm.Notification", require_ready=True
            )
            notification_model.objects.create(
                user=self.status.user,
                notification_type="FAVORITE",
                related_user=self.user,
                related_status=self.status,
            )

    def delete(self, *args, **kwargs):
        """ delete and delete notifications """
        # check for notification
        if self.status.user.local:
            notification_model = apps.get_model(
                "bookwyrm.Notification", require_ready=True
            )
            notification = notification_model.objects.filter(
                user=self.status.user,
                related_user=self.user,
                related_status=self.status,
                notification_type="FAVORITE",
            ).first()
            if notification:
                notification.delete()
        super().delete(*args, **kwargs)

    class Meta:
        """ can't fav things twice """

        unique_together = ("user", "status")