"""Game widgets reuse canonical TMDb cards and asynchronously request missing metadata."""
import os
import sys
import tempfile
import unittest
from unittest.mock import patch

sys.path.insert(0, os.path.dirname(__file__))
import stubs
stubs.install()
from wcs.library2 import meta, rows, store
from wcs.skin import refresh, widgets


class GameMetadataTests(unittest.TestCase):
    def setUp(self):
        self.directory = tempfile.TemporaryDirectory()
        store.set_path(os.path.join(self.directory.name, 'library.db'))

    def tearDown(self):
        self.directory.cleanup()

    def test_demo_and_history_use_same_tmdb_description_and_facts(self):
        detail = {'title': 'Matrix', 'overview': 'Canonical TMDb overview', 'release_date': '1999-03-30',
                  'genres': [{'id': 878, 'name': 'Science fiction'}], 'runtime': 136,
                  'vote_average': 8.2, 'backdrop_path': '/canonical.jpg'}
        meta.put(meta.key_movie(603), detail, meta.TTL_MOVIE)
        data = rows.Data()
        demo, card = widgets._game_metadata(data, {'tmdb_id': 603, 'media_type': 'movie', 'plot': 'Demo text'})
        history, history_card = widgets._game_metadata(data, {'tmdb_id': 603, 'media_type': 'movie', 'plot': 'History text'})
        self.assertEqual(demo['plot'], detail['overview'])
        self.assertEqual(history['plot'], demo['plot'])
        self.assertEqual(card, history_card)
        self.assertEqual(card['runtime'], 136)
        self.assertEqual(card['genre'], 'Science fiction')

    def test_game_hero_keeps_exactly_the_movie_hero_description(self):
        from wcs.skin import hero
        import xbmcgui
        card = {'title': 'Matrix', 'plot': ' '.join(['description'] * 40),
                'genre': 'Action', 'year': '1999', 'runtime': 136}
        item = xbmcgui.ListItem('Matrix')
        widgets._challenge(item, 'Matrix', 'movie', '1999', '', [], 'Short legacy text', card)
        self.assertEqual(item.getProperty('milionar.hero.plot'), hero.movie(card)['plot'])
        self.assertGreater(len(item.getProperty('milionar.hero.plot')), hero.NOW_PLOT_CHARS)

    def test_missing_cache_preserves_offline_demo_and_requests_background_fetch(self):
        data = rows.Data()
        source = {'tmdb_id': 603, 'media_type': 'movie', 'title': 'Matrix', 'plot': 'Offline description'}
        entry, card = widgets._game_metadata(data, source)
        self.assertEqual(entry, source)
        self.assertIsNone(card)
        with patch.object(refresh, 'request') as request:
            widgets._request_game_metadata(data)
        request.assert_called_once_with(['library:movie:603'])

    def test_metadata_changes_invalidate_demo_rows(self):
        self.assertIn('widget_demo_movies', refresh.media_rows('movie'))
        self.assertIn('widget_demo_series', refresh.media_rows('tv'))
        self.assertIn('widget_game_topics', refresh.media_rows('movie'))


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