import unittest
import datetime

from email.utils import formatdate

from tests import NyaaTestCase
from nyaa.template_utils import (_jinja2_filter_rfc822, _jinja2_filter_rfc822_es, get_utc_timestamp,
                                 get_display_time, timesince, filter_truthy, category_name)


class TestTemplateUtils(NyaaTestCase):

    # def setUp(self):
    #     self.db, nyaa.app.config['DATABASE'] = tempfile.mkstemp()
    #     nyaa.app.config['TESTING'] = True
    #     self.app = nyaa.app.test_client()
    #     with nyaa.app.app_context():
    #         nyaa.db.create_all()
    #
    # def tearDown(self):
    #     os.close(self.db)
    #     os.unlink(nyaa.app.config['DATABASE'])

    def test_filter_rfc822(self):
        # test with timezone UTC
        test_date = datetime.datetime(2017, 2, 15, 11, 15, 34, 100, datetime.timezone.utc)
        self.assertEqual(_jinja2_filter_rfc822(test_date), 'Wed, 15 Feb 2017 11:15:34 -0000')

    def test_filter_rfc822_es(self):
        # test with local timezone
        test_date_str = '2017-02-15T11:15:34'
        # this is in order to get around local time zone issues
        expected = formatdate(float(datetime.datetime(2017, 2, 15, 11, 15, 34, 100).timestamp()))
        self.assertEqual(_jinja2_filter_rfc822_es(test_date_str), expected)

    def test_get_utc_timestamp(self):
        # test with local timezone
        test_date_str = '2017-02-15T11:15:34'
        self.assertEqual(get_utc_timestamp(test_date_str), 1487157334)

    def test_get_display_time(self):
        # test with local timezone
        test_date_str = '2017-02-15T11:15:34'
        self.assertEqual(get_display_time(test_date_str), '2017-02-15 11:15')

    def test_timesince(self):
        now = datetime.datetime.utcnow()
        self.assertEqual(timesince(now), 'just now')
        self.assertEqual(timesince(now - datetime.timedelta(seconds=5)), '5 seconds ago')
        self.assertEqual(timesince(now - datetime.timedelta(minutes=1)), '1 minute ago')
        self.assertEqual(
            timesince(now - datetime.timedelta(minutes=38, seconds=43)), '38 minutes ago')
        self.assertEqual(
            timesince(now - datetime.timedelta(hours=2, minutes=38, seconds=51)), '2 hours ago')
        bigger = now - datetime.timedelta(days=3)
        self.assertEqual(timesince(bigger), bigger.strftime('%Y-%m-%d %H:%M UTC'))

    @unittest.skip('Not yet implemented')
    def test_static_cachebuster(self):
        pass

    @unittest.skip('Not yet implemented')
    def test_modify_query(self):
        pass

    def test_filter_truthy(self):
        my_list = [
            True, False,  # booleans
            'hello!', '',  # strings
            1, 0, -1,  # integers
            1.0, 0.0, -1.0,  # floats
            ['test'], [],  # lists
            {'marco': 'polo'}, {},  # dictionaries
            None
        ]
        expected_result = [
            True,
            'hello!',
            1, -1,
            1.0, -1.0,
            ['test'],
            {'marco': 'polo'}
        ]
        self.assertListEqual(filter_truthy(my_list), expected_result)

    def test_category_name(self):
        with self.app_context:
            # Nyaa categories only
            self.assertEqual(category_name('1_0'), 'Anime')
            self.assertEqual(category_name('1_2'), 'Anime - English-translated')
            # Unknown category ids
            self.assertEqual(category_name('100_0'), '???')
            self.assertEqual(category_name('1_100'), '???')
            self.assertEqual(category_name('0_0'), '???')


if __name__ == '__main__':
    unittest.main()