"""
    Slixmpp: The Slick XMPP Library
    Copyright (C) 2011 Nathanael C. Fritz, Lance J.T. Stout
    This file is part of Slixmpp.

    See the file LICENSE for copying permission.
"""

import logging

from slixmpp import JID
from typing import Optional, Callable
from slixmpp.plugins.base import BasePlugin
from slixmpp.plugins.xep_0196 import stanza, UserGaming
from slixmpp.plugins.xep_0004.stanza import Form


log = logging.getLogger(__name__)


class XEP_0196(BasePlugin):

    """
    XEP-0196: User Gaming
    """

    name = 'xep_0196'
    description = 'XEP-0196: User Gaming'
    dependencies = {'xep_0163'}
    stanza = stanza

    def plugin_end(self):
        self.xmpp['xep_0030'].del_feature(feature=UserGaming.namespace)
        self.xmpp['xep_0163'].remove_interest(UserGaming.namespace)

    def session_bind(self, jid):
        self.xmpp['xep_0163'].register_pep('user_gaming', UserGaming)

    def publish_gaming(self, name: Optional[str] = None,
                       level: Optional[str] = None,
                       server_name: Optional[str] = None,
                       uri: Optional[str] = None,
                       character_name: Optional[str] = None,
                       character_profile: Optional[str] = None,
                       server_address: Optional[str] = None,
                       options: Optional[Form] = None,
                       ifrom: Optional[JID] = None,
                       callback: Optional[Callable] = None,
                       timeout: Optional[int] = None,
                       timeout_callback: Optional[Callable]=None):
        """
        Publish the user's current gaming status.

        :param name: The name of the game.
        :param level: The user's level in the game.
        :param uri: A URI for the game or relevant gaming service
        :param server_name: The name of the server where the user is playing.
        :param server_address: The hostname or IP address of the server where the
                               user is playing.
        :param character_name: The name of the user's character in the game.
        :param character_profile: A URI for a profile of the user's character.
        :param options: Optional form of publish options.
        """
        gaming = UserGaming()
        gaming['name'] = name
        gaming['level'] = level
        gaming['uri'] = uri
        gaming['character_name'] = character_name
        gaming['character_profile'] = character_profile
        gaming['server_name'] = server_name
        gaming['server_address'] = server_address
        return self.xmpp['xep_0163'].publish(gaming,
                                             node=UserGaming.namespace,
                                             options=options, ifrom=ifrom,
                                             callback=callback, timeout=timeout,
                                             timeout_callback=timeout_callback)

    def stop(self, ifrom=None, callback=None, timeout=None,
                   timeout_callback=None):
        """
        Clear existing user gaming information to stop notifications.
        """
        gaming = UserGaming()
        return self.xmpp['xep_0163'].publish(gaming,
                                             node=UserGaming.namespace,
                                             ifrom=ifrom, callback=callback,
                                             timeout=timeout,
                                             timeout_callback=timeout_callback)
