from django.shortcuts import resolve_url
from django_nyt.models import Settings

from tests.base import ArticleWebTestUtils
from tests.base import DjangoClientTestBase
from tests.base import RequireRootArticleMixin


class NotificationSettingsTests(
    RequireRootArticleMixin, ArticleWebTestUtils, DjangoClientTestBase
):
    def setUp(self):
        super().setUp()

    def test_login_required(self):
        self.client.logout()
        response = self.client.get(resolve_url("wiki:notification_settings"))
        self.assertEqual(response.status_code, 302)

    def test_when_logged_in(self):
        response = self.client.get(resolve_url("wiki:notification_settings"))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(
            response, "wiki/plugins/notifications/settings.html"
        )

    def test_change_settings(self):
        self.settings, __ = Settings.objects.get_or_create(
            user=self.superuser1, is_default=True
        )

        url = resolve_url("wiki:notification_settings")

        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)
        data = {"csrf_token": response.context["csrf_token"]}

        # management form information, needed because of the formset
        management_form = response.context["form"].management_form

        for i in (
            "TOTAL_FORMS",
            "INITIAL_FORMS",
            "MIN_NUM_FORMS",
            "MAX_NUM_FORMS",
        ):
            data[f"{management_form.prefix}-{i}"] = management_form[i].value()

        for i in range(response.context["form"].total_form_count()):
            # get form index 'i'
            current_form = response.context["form"].forms[i]

            # retrieve all the fields
            for field_name in current_form.fields:
                value = current_form[field_name].value()
                data[f"{current_form.prefix}-{field_name}"] = (
                    value if value is not None else ""
                )

        data["form-TOTAL_FORMS"] = 1
        data["form-0-email"] = 2
        data["form-0-interval"] = 0
        # post the request without any change

        response = self.client.post(url, data, follow=True)

        self.assertEqual(len(response.context.get("messages")), 1)

        message = response.context.get("messages")._loaded_messages[0]
        self.assertIn(
            message.message,
            "You will receive notifications instantly for 0 articles",
        )

        # Ensure we didn't create redundant Settings objects
        assert self.superuser1.nyt_settings.all().count() == 1
