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

    See the file LICENSE for copying permission.
"""

from slixmpp.xmlstream import ElementBase, ET


class UserActivity(ElementBase):

    name = 'activity'
    namespace = 'http://jabber.org/protocol/activity'
    plugin_attrib = 'activity'
    interfaces = {'value', 'text'}
    sub_interfaces = {'text'}
    general = {'doing_chores', 'drinking', 'eating', 'exercising',
               'grooming', 'having_appointment', 'inactive', 'relaxing',
               'talking', 'traveling', 'undefined', 'working'}
    specific = {'at_the_spa', 'brushing_teeth', 'buying_groceries',
                'cleaning', 'coding', 'commuting', 'cooking', 'cycling',
                'dancing', 'day_off', 'doing_maintenance',
                'doing_the_dishes', 'doing_the_laundry', 'driving',
                'fishing', 'gaming', 'gardening', 'getting_a_haircut',
                'going_out', 'hanging_out', 'having_a_beer',
                'having_a_snack', 'having_breakfast', 'having_coffee',
                'having_dinner', 'having_lunch', 'having_tea', 'hiding',
                'hiking', 'in_a_car', 'in_a_meeting', 'in_real_life',
                'jogging', 'on_a_bus', 'on_a_plane', 'on_a_train',
                'on_a_trip', 'on_the_phone', 'on_vacation',
                'on_video_phone', 'other', 'partying', 'playing_sports',
                'praying', 'reading', 'rehearsing', 'running',
                'running_an_errand', 'scheduled_holiday', 'shaving',
                'shopping', 'skiing', 'sleeping', 'smoking',
                'socializing', 'studying', 'sunbathing', 'swimming',
                'taking_a_bath', 'taking_a_shower', 'thinking',
                'walking', 'walking_the_dog', 'watching_a_movie',
                'watching_tv', 'working_out', 'writing'}

    def set_value(self, value):
        self.del_value()
        general = value
        specific = None
        if isinstance(value, tuple) or isinstance(value, list):
            general = value[0]
            specific = value[1]

        if general in self.general:
            gen_xml = ET.Element('{%s}%s' % (self.namespace, general))
            if specific:
                spec_xml = ET.Element('{%s}%s' % (self.namespace, specific))
                if specific in self.specific:
                    gen_xml.append(spec_xml)
                else:
                    raise ValueError('Unknown specific activity')
            self.xml.append(gen_xml)
        else:
            raise ValueError('Unknown general activity')

    def get_value(self):
        general = None
        specific = None
        gen_xml = None
        for child in self.xml:
            if child.tag.startswith('{%s}' % self.namespace):
                elem_name = child.tag.split('}')[-1]
                if elem_name in self.general:
                    general = elem_name
                    gen_xml = child
        if gen_xml is not None:
            for child in gen_xml:
                if child.tag.startswith('{%s}' % self.namespace):
                    elem_name = child.tag.split('}')[-1]
                    if elem_name in self.specific:
                        specific = elem_name
        return (general, specific)

    def del_value(self):
        curr_value = self.get_value()
        if curr_value[0]:
            self._set_sub_text(curr_value[0], '', keep=False)
