"""
    Slixmpp: The Slick XMPP Library
    Copyright (C) 2010 Nathanael C. Fritz, Erik Reuterborg Larsson
    This file is part of Slixmpp.

    See the file LICENSE for copying permission.
"""

import logging

import slixmpp
from slixmpp.plugins.base import BasePlugin
from slixmpp.xmlstream import register_stanza_plugin
from slixmpp.plugins.xep_0080 import stanza, Geoloc


log = logging.getLogger(__name__)


class XEP_0080(BasePlugin):

    """
    XEP-0080: User Location
    """

    name = 'xep_0080'
    description = 'XEP-0080: User Location'
    dependencies = {'xep_0163'}
    stanza = stanza

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

    def session_bind(self, jid):
        self.xmpp['xep_0163'].register_pep('user_location', Geoloc)

    def publish_location(self, **kwargs):
        """
        Publish the user's current location.

        :param accuracy: Horizontal GPS error in meters.
        :param alt: Altitude in meters above or below sea level.
        :param area: A named area such as a campus or neighborhood.
        :param bearing: GPS bearing (direction in which the entity is
                        heading to reach its next waypoint), measured in
                        decimal degrees relative to true north.
        :param building: A specific building on a street or in an area.
        :param country: The nation where the user is located.
        :param countrycode: The ISO 3166 two-letter country code.
        :param datum: GPS datum.
        :param description: A natural-language name for or description of
                            the location.
        :param error: Horizontal GPS error in arc minutes. Obsoleted by
                      the accuracy parameter.
        :param floor: A particular floor in a building.
        :param lat: Latitude in decimal degrees North.
        :param locality: A locality within the administrative region, such
                         as a town or city.
        :param lon: Longitude in decimal degrees East.
        :param postalcode: A code used for postal delivery.
        :param region: An administrative region of the nation, such
                       as a state or province.
        :param room: A particular room in a building.
        :param speed: The speed at which the entity is moving,
                      in meters per second.
        :param street: A thoroughfare within the locality, or a crossing
                       of two thoroughfares.
        :param text: A catch-all element that captures any other
                     information about the location.
        :param timestamp: UTC timestamp specifying the moment when the
                          reading was taken.
        :param uri: A URI or URL pointing to information about
                    the location.
        :param options: Optional form of publish options.
        """
        options = kwargs.get('options', None)
        ifrom = kwargs.get('ifrom', None)
        callback = kwargs.get('callback', None)
        timeout = kwargs.get('timeout', None)
        timeout_callback = kwargs.get('timeout_callback', None)
        for param in ('ifrom', 'block', 'callback', 'timeout', 'options', 'timeout_callback'):
            if param in kwargs:
                del kwargs[param]

        geoloc = Geoloc()
        geoloc.values = kwargs

        return self.xmpp['xep_0163'].publish(geoloc,
                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 location information to stop notifications.
        """
        geoloc = Geoloc()
        return self.xmpp['xep_0163'].publish(geoloc,
                ifrom=ifrom,
                callback=callback,
                timeout=timeout,
                timeout_callback=None)
