from django.test import TestCase
from model_bakery import baker

from fellchensammlung.models import User, TrustLevel, Species, Location, AdoptionNotice, Notification
from fellchensammlung.tools.model_helpers import NotificationTypeChoices, AdoptionNoticeStatusChoices
from fellchensammlung.tools.notifications import notify_of_AN_to_be_checked


class TestNotifications(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.test_user0 = User.objects.create_user(username='testuser0',
                                                  first_name="Admin",
                                                  last_name="BOFH",
                                                  password='12345')

        cls.test_user1 = User.objects.create_user(username='testuser1',
                                                  first_name="Max",
                                                  last_name="Müller",
                                                  password='12345')
        cls.test_user2 = User.objects.create_user(username='testuser2',
                                                  first_name="Miriam",
                                                  last_name="Müller",
                                                  password='12345')
        cls.test_user0.trust_level = TrustLevel.ADMIN
        cls.test_user0.save()

        cls.adoption1 = baker.make(AdoptionNotice, name="TestAdoption1", owner=cls.test_user1, )
        cls.adoption1.adoption_notice_status = AdoptionNoticeStatusChoices.AwaitingAction.WAITING_FOR_REVIEW

    def test_notify_of_AN_to_be_checked(self):
        notify_of_AN_to_be_checked(self.adoption1)
        self.assertTrue(Notification.objects.filter(user_to_notify=self.test_user0,
                                                    adoption_notice=self.adoption1,
                                                    notification_type=NotificationTypeChoices.AN_IS_TO_BE_CHECKED).exists())
        self.assertTrue(Notification.objects.filter(user_to_notify=self.test_user1,
                                                    adoption_notice=self.adoption1,
                                                    notification_type=NotificationTypeChoices.AN_IS_TO_BE_CHECKED).exists())
        self.assertFalse(Notification.objects.filter(user_to_notify=self.test_user2,
                                                     adoption_notice=self.adoption1,
                                                     notification_type=NotificationTypeChoices.AN_IS_TO_BE_CHECKED).exists())
