"""
Tabs for courseware.
"""
from openedx.core.lib.api.plugins import PluginManager

# Stevedore extension point namespaces
COURSE_TAB_NAMESPACE = 'openedx.course_tab'


class CourseTabPluginManager(PluginManager):
    """
    Manager for all of the course tabs that have been made available.

    All course tabs should implement `CourseTab`.
    """
    NAMESPACE = COURSE_TAB_NAMESPACE

    @classmethod
    def get_tab_types(cls):
        """
        Returns the list of available course tabs in their canonical order.
        """
        def compare_tabs(first_type, second_type):
            """Compares two course tabs, for use in sorting."""
            first_priority = first_type.priority
            second_priority = second_type.priority
            if first_priority != second_priority:
                if first_priority is None:
                    return 1
                elif second_priority is None:
                    return -1
                else:
                    return first_priority - second_priority
            first_type = first_type.type
            second_type = second_type.type
            if first_type < second_type:
                return -1
            elif first_type == second_type:
                return 0
            else:
                return 1
        tab_types = cls.get_available_plugins().values()
        tab_types.sort(cmp=compare_tabs)
        return tab_types
