"""
Defines the roster sorting methods used in roster.py
(for contacts/groups)
"""

########################### Contacts sorting ############################

PRESENCE_PRIORITY = {'unavailable': 5,
                     'xa': 4,
                     'away': 3,
                     'dnd': 2,
                     '': 1,
                     'available': 1}

def sort_jid(contact):
    """Sort by contact JID"""
    return contact.bare_jid

def sort_show(contact):
    """Sort by show (from high availability to low)"""
    res = contact.get_highest_priority_resource()
    if not res:
        return 5
    show = res.presence
    if show not in PRESENCE_PRIORITY:
        return 0
    return PRESENCE_PRIORITY[show]

def sort_resource_nb(contact):
    """Sort by number of connected resources"""
    return - len(contact)

def sort_name(contact):
    """Sort by name (case insensitive)"""
    return contact.name.lower() or contact.bare_jid

def sort_sname(contact):
    """Sort by name (case sensitive)"""
    return contact.name or contact.bare_jid

def sort_online(contact):
    """Sort by connected/disconnected"""
    result = sort_show(contact)
    return 0 if result < 5 else 1

SORTING_METHODS = {
    'jid': sort_jid,
    'sname': sort_sname,
    'show': sort_show,
    'resource': sort_resource_nb,
    'name': sort_name,
    'online': sort_online,
}


######################## Roster Groups sorting ##########################

def sort_group_name(group):
    """Sort by name (case insensitive)"""
    return group.name.lower()

def sort_group_sname(group):
    """Sort by name (case-sensitive)"""
    return group.name

def sort_group_folded(group):
    """Sort by folded/unfolded"""
    return group.folded

def sort_group_connected(group):
    """Sort by number of connected contacts"""
    return - group.get_nb_connected_contacts()

def sort_group_size(group):
    """Sort by group size"""
    return - len(group)

def sort_group_none(group):
    """Put the none group at the end, if any"""
    return 0 if group.name != 'none' else 1

GROUP_SORTING_METHODS = {
        'name': sort_group_name,
        'fold': sort_group_folded,
        'connected': sort_group_connected,
        'size': sort_group_size,
        'none': sort_group_none,
        'sname': sort_group_sname,
}