# -*- coding: utf-8 -*-
from flask import url_for

from phshare.extensions import db
from phshare.models import User, Role, Tag
from tests.base import BaseTestCase


class AdminTestCase(BaseTestCase):

    def setUp(self):
        super(AdminTestCase, self).setUp()
        self.login(email='admin@helloflask.com', password='123')

    def test_index_page(self):
        response = self.client.get(url_for('admin.index'))
        data = response.get_data(as_text=True)
        self.assertIn('Phshare Dashboard', data)

    def test_bad_permission(self):
        self.logout()
        response = self.client.get(url_for('admin.index'), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Please log in to access this page.', data)
        self.assertNotIn('Phshare Dashboard', data)

        self.login()  # normal user, without MODERATOR permission
        response = self.client.get(url_for('admin.index'))
        data = response.get_data(as_text=True)
        self.assertEqual(response.status_code, 403)
        self.assertNotIn('Phshare Dashboard', data)

    def test_edit_profile_admin(self):
        role_id = Role.query.filter_by(name='Locked').first().id
        response = self.client.post(url_for('admin.edit_profile_admin', user_id=2), data=dict(
            username='newname',
            role=role_id,
            confirmed=True,
            active=True,
            name='New Name',
            email='new@helloflask.com'
        ), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Profile updated.', data)
        user = User.query.get(2)
        self.assertEqual(user.name, 'New Name')
        self.assertEqual(user.username, 'newname')
        self.assertEqual(user.email, 'new@helloflask.com')
        self.assertEqual(user.role.name, 'Locked')

    def test_block_user(self):
        response = self.client.post(url_for('admin.block_user', user_id=2), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Account blocked.', data)
        user = User.query.get(2)
        self.assertEqual(user.active, False)

    def test_unblock_user(self):
        user = User.query.get(2)
        user.active = False
        db.session.commit()
        self.assertEqual(user.active, False)

        response = self.client.post(url_for('admin.unblock_user', user_id=2), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Block canceled.', data)
        user = User.query.get(2)
        self.assertEqual(user.active, True)

    def test_lock_user(self):
        response = self.client.post(url_for('admin.lock_user', user_id=2), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Account locked.', data)
        user = User.query.get(2)
        self.assertEqual(user.role.name, 'Locked')

    def test_unlock_user(self):
        user = User.query.get(2)
        user.role = Role.query.filter_by(name='Locked').first()
        db.session.commit()
        self.assertEqual(user.role.name, 'Locked')

        response = self.client.post(url_for('admin.unlock_user', user_id=2), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Lock canceled.', data)
        user = User.query.get(2)
        self.assertEqual(user.role.name, 'User')

    def test_delete_tag(self):
        tag = Tag()
        db.session.add(tag)
        db.session.commit()
        self.assertIsNotNone(Tag.query.get(1))

        response = self.client.post(url_for('admin.delete_tag', tag_id=1), follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('Tag deleted.', data)
        self.assertEqual(Tag.query.get(1), None)

    def test_manage_user_page(self):
        response = self.client.get(url_for('admin.manage_user'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Users', data)
        self.assertIn('Admin', data)
        self.assertIn('Locked', data)
        self.assertIn('Normal', data)

        response = self.client.get(url_for('admin.manage_user', filter='locked'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Users', data)
        self.assertIn('Locked User', data)
        self.assertNotIn('Normal User', data)

        response = self.client.get(url_for('admin.manage_user', filter='blocked'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Users', data)
        self.assertIn('Blocked User', data)
        self.assertNotIn('Locked User', data)
        self.assertNotIn('Normal User', data)

        response = self.client.get(url_for('admin.manage_user', filter='administrator'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Users', data)
        self.assertIn('Admin', data)
        self.assertNotIn('Blocked User', data)
        self.assertNotIn('Locked User', data)
        self.assertNotIn('Normal User', data)

        response = self.client.get(url_for('admin.manage_user', filter='moderator'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Users', data)
        self.assertIn('Admin', data)
        self.assertNotIn('Blocked User', data)
        self.assertNotIn('Locked User', data)
        self.assertNotIn('Normal User', data)

    def test_manage_photo_page(self):
        response = self.client.get(url_for('admin.manage_photo'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Photos', data)
        self.assertIn('Order by flag <span class="oi oi-elevator"></span>', data)

        response = self.client.get(url_for('admin.manage_photo', order='by_time'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Photos', data)
        self.assertIn('Order by time <span class="oi oi-elevator"></span>', data)

    def test_manage_tag_page(self):
        response = self.client.get(url_for('admin.manage_tag'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Tags', data)

    def test_manage_comment_page(self):
        response = self.client.get(url_for('admin.manage_comment'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Comments', data)
        self.assertIn('Order by flag <span class="oi oi-elevator"></span>', data)

        response = self.client.get(url_for('admin.manage_comment', order='by_time'))
        data = response.get_data(as_text=True)
        self.assertIn('Manage Comments', data)
        self.assertIn('Order by time <span class="oi oi-elevator"></span>', data)
