from loguru import logger

from flexget import plugin
from flexget.entry import Entry
from flexget.event import event
from flexget.utils.cached_input import cached

try:
    from filmweb.exceptions import RequestFailed
    from filmweb.filmweb import Filmweb as FilmwebAPI
    from filmweb.items import LoggedUser
except ImportError:
    # Errors are handled later
    pass


logger = logger.bind(name='filmweb_watchlist')


def translate_type(type):
    return {'shows': 'serial', 'movies': 'film'}[type]


class FilmwebWatchlist:
    """"Creates an entry for each movie in your Filmweb list."""

    schema = {
        'type': 'object',
        'properties': {
            'login': {'type': 'string', 'description': 'Can be username or email address'},
            'password': {'type': 'string'},
            'type': {'type': 'string', 'enum': ['shows', 'movies'], 'default': 'movies'},
            'min_star': {
                'type': 'integer',
                'default': 0,
                'description': 'Items will be processed with at least this level of "How much I want to see"',
            },
        },
        'additionalProperties': False,
        'required': ['login', 'password'],
    }

    def on_task_start(self, task, config):
        """Raise a DependencyError if our dependencies aren't available"""
        try:
            from filmweb.filmweb import Filmweb as FilmwebAPI  # noqa
        except ImportError as e:
            logger.debug('Error importing pyfilmweb: {}', e)
            raise plugin.DependencyError(
                'filmweb_watchlist',
                'pyfilmweb',
                'pyfilmweb==0.1.1.1 module required. ImportError: %s' % e,
                logger,
            )

    @cached('filmweb_watchlist', persist='2 hours')
    def on_task_input(self, task, config):
        type = translate_type(config['type'])

        logger.verbose('Retrieving filmweb watch list for user: {}', config['login'])

        fw = FilmwebAPI()
        logger.verbose('Logging as {}', config['login'])

        try:
            fw.login(str(config['login']), str(config['password']))
        except RequestFailed as error:
            raise plugin.PluginError('Authentication request failed, reason %s' % str(error))

        user = LoggedUser(fw)

        try:
            watch_list = user.get_want_to_see()
        except RequestFailed as error:
            raise plugin.PluginError('Fetching watch list failed, reason %s' % str(error))

        logger.verbose('Filmweb list contains {} items', len(watch_list))

        entries = []
        for item in watch_list:
            if item['level'] < config['min_star']:
                continue

            if item['film'].type != type:
                continue

            item_info = item['film'].get_info()

            entry = Entry()
            entry['title'] = item_info['name_org'] or item_info['name']
            entry['title'] += ' (%s)' % item_info['year']
            entry['year'] = item_info['year']
            entry['url'] = item['film'].url
            entry['filmweb_type'] = item_info['type']
            entry['filmweb_id'] = item['film'].uid

            logger.debug('Created entry {}', entry)

            entries.append(entry)

        return entries


@event('plugin.register')
def register_plugin():
    plugin.register(FilmwebWatchlist, 'filmweb_watchlist', api_ver=2)
