from datetime import timedelta

from django.contrib.auth.models import User
from django.test import TestCase
from django.utils import timezone

from bda.models import (
    Attribution,
    CategorieSpectacle,
    Participant,
    Salle,
    Spectacle,
    SpectacleRevente,
    Tirage,
)


class TestModels(TestCase):
    def setUp(self):
        self.tirage = Tirage.objects.create(
            title="Tirage test",
            appear_catalogue=True,
            ouverture=timezone.now(),
            fermeture=timezone.now(),
        )
        self.category = CategorieSpectacle.objects.create(name="Category")
        self.location = Salle.objects.create(name="here")
        self.spectacle_soon = Spectacle.objects.create(
            title="foo",
            date=timezone.now() + timedelta(days=1),
            location=self.location,
            price=0,
            slots=42,
            tirage=self.tirage,
            listing=False,
            category=self.category,
        )
        self.spectacle_later = Spectacle.objects.create(
            title="bar",
            date=timezone.now() + timedelta(days=30),
            location=self.location,
            price=0,
            slots=42,
            tirage=self.tirage,
            listing=False,
            category=self.category,
        )

        user_buyer = User.objects.create_user(
            username="bda_buyer", password="testbuyer"
        )
        user_seller = User.objects.create_user(
            username="bda_seller", password="testseller"
        )
        self.buyer = Participant.objects.create(user=user_buyer, tirage=self.tirage)
        self.seller = Participant.objects.create(user=user_seller, tirage=self.tirage)

        self.attr_soon = Attribution.objects.create(
            participant=self.seller, spectacle=self.spectacle_soon
        )
        self.attr_later = Attribution.objects.create(
            participant=self.seller, spectacle=self.spectacle_later
        )
        self.revente_soon = SpectacleRevente.objects.create(
            seller=self.seller, attribution=self.attr_soon
        )
        self.revente_later = SpectacleRevente.objects.create(
            seller=self.seller, attribution=self.attr_later
        )

    def test_urgent(self):
        self.assertTrue(self.revente_soon.is_urgent)
        self.assertFalse(self.revente_later.is_urgent)

    def test_tirage(self):
        self.revente_soon.confirmed_entry.add(self.buyer)

        self.assertEqual(self.revente_soon.tirage(send_mails=False), self.buyer)
        self.assertIsNone(self.revente_later.tirage(send_mails=False))