from datetime import datetime, timedelta

from django.urls import reverse

from misago.admin.testutils import AdminTestCase
from misago.users.models import Ban


class BanAdminViewsTests(AdminTestCase):
    def test_link_registered(self):
        """admin nav contains bans link"""
        response = self.client.get(reverse('misago:admin:users:accounts:index'))

        response = self.client.get(response['location'])
        self.assertContains(response, reverse('misago:admin:users:bans:index'))

    def test_list_view(self):
        """bans list view returns 200"""
        response = self.client.get(reverse('misago:admin:users:bans:index'))
        self.assertEqual(response.status_code, 302)

        response = self.client.get(response['location'])
        self.assertEqual(response.status_code, 200)

    def test_mass_delete(self):
        """adminview deletes multiple bans"""
        test_date = datetime.now() + timedelta(days=180)

        for i in range(10):
            response = self.client.post(
                reverse('misago:admin:users:bans:new'),
                data={
                    'check_type': '1',
                    'banned_value': '%stest@test.com' % i,
                    'user_message': 'Lorem ipsum dolor met',
                    'staff_message': 'Sit amet elit',
                    'expires_on': test_date.isoformat(),
                },
            )
            self.assertEqual(response.status_code, 302)

        self.assertEqual(Ban.objects.count(), 10)

        bans_pks = []
        for ban in Ban.objects.iterator():
            bans_pks.append(ban.pk)

        response = self.client.post(
            reverse('misago:admin:users:bans:index'),
            data={
                'action': 'delete',
                'selected_items': bans_pks,
            },
        )
        self.assertEqual(response.status_code, 302)
        self.assertEqual(Ban.objects.count(), 0)

    def test_new_view(self):
        """new ban view has no showstoppers"""
        response = self.client.get(reverse('misago:admin:users:bans:new'))
        self.assertEqual(response.status_code, 200)

        test_date = datetime.now() + timedelta(days=180)

        response = self.client.post(
            reverse('misago:admin:users:bans:new'),
            data={
                'check_type': '1',
                'banned_value': 'test@test.com',
                'user_message': 'Lorem ipsum dolor met',
                'staff_message': 'Sit amet elit',
                'expires_on': test_date.isoformat(),
            },
        )
        self.assertEqual(response.status_code, 302)

        response = self.client.get(reverse('misago:admin:users:bans:index'))
        response = self.client.get(response['location'])
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'test@test.com')

    def test_edit_view(self):
        """edit ban view has no showstoppers"""
        self.client.post(
            reverse('misago:admin:users:bans:new'),
            data={
                'check_type': '0',
                'banned_value': 'Admin',
            },
        )

        test_ban = Ban.objects.get(banned_value='admin')
        form_link = reverse(
            'misago:admin:users:bans:edit',
            kwargs={
                'pk': test_ban.pk,
            },
        )

        response = self.client.post(
            form_link,
            data={
                'check_type': '1',
                'banned_value': 'test@test.com',
                'user_message': 'Lorem ipsum dolor met',
                'staff_message': 'Sit amet elit',
                'expires_on': '',
            },
        )
        self.assertEqual(response.status_code, 302)

        response = self.client.get(reverse('misago:admin:users:bans:index'))
        response = self.client.get(response['location'])
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'test@test.com')

    def test_delete_view(self):
        """delete ban view has no showstoppers"""
        self.client.post(
            reverse('misago:admin:users:bans:new'),
            data={
                'check_type': '0',
                'banned_value': 'TestBan',
            },
        )

        test_ban = Ban.objects.get(banned_value='testban')

        response = self.client.post(
            reverse(
                'misago:admin:users:bans:delete',
                kwargs={
                    'pk': test_ban.pk,
                },
            )
        )
        self.assertEqual(response.status_code, 302)

        response = self.client.get(reverse('misago:admin:users:bans:index'))
        self.client.get(response['location'])
        response = self.client.get(response['location'])

        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, test_ban.banned_value)