import zope.component

from zope.component import getUtility

from Products.CMFCore.utils import getToolByName
from Products.Five.viewlet.viewlet import ViewletBase
from Products.OpenPlans.interfaces import IProject
from topp.featurelets.interfaces import IFeatureletSupporter
from projectinfo import ProjectInfoView
from memberinfo import MemberInfoView
from menu_item import MenuItem

class MenuItemList(ViewletBase):

    def __init__(self, context, request, view, manager):
        super(ViewletBase, self).__init__(context, request, view, manager)
        self._context = (context,)
        self.menu_items = []

    def menuItems(self):
        """ override this function """
        return self.menu_items

    def addMenuItem(self, title='', url=''):
        self.menu_items.append({'title': title, 'url': url})


class NavMenu(MenuItemList):
    ### different modes for the Navigation Secion of the Personal bar

    def addPersonalView(self):
        mtool = getToolByName(self.context, 'portal_membership')
        mdtool = getToolByName(self.context, 'portal_memberdata')
        homefolder = mtool.getHomeFolder()

        me = mtool.getAuthenticatedMember().getId()
        profile = '/'.join((mdtool.absolute_url(), me, 'view'))
        preferences = '/'.join((mdtool.absolute_url(), me, 'edit'))

        self.addMenuItem('My Profile', profile)
        self.addMenuItem('My Home', homefolder.absolute_url())
        self.addMenuItem('My Preferences', preferences)

    def addMemberView(self):
        mtool = getToolByName(self.context, 'portal_membership')
        mdtool = getToolByName(self.context, 'portal_memberdata')

        memberInfoView = zope.component.queryMultiAdapter((self._context[0], self.request), name='member_info')
        member = memberInfoView.getMember()
        member_folder = memberInfoView.member_folder()

        profile = '/'.join((mdtool.absolute_url(), 
                            memberInfoView.getMemberId(), 'view'))

        self.addMenuItem('Member Profile', profile)

        if member_folder:
            self.addMenuItem('Member Home', 
                             member_folder.absolute_url())

        try:
            show_email = not member.useAnonByDefault
            if show_email:
                self.addMenuItem('Contact', 'mailto:' + member.email)
        except AttributeError:
            pass

    def addProjectView(self):
        projectInfoView = zope.component.queryMultiAdapter((self._context[0], self.request), name='project_info')

        proj_home_url = projectInfoView.project.absolute_url()
        self.addMenuItem('Project Home', proj_home_url)

        self.addMenuItem('Contents', '/'.join((proj_home_url, 'folder_contents')))
        self.addMenuItem('Contact', '/'.join((proj_home_url, 'contact_project_admins')))

        supporter = IFeatureletSupporter(projectInfoView.project)

        for i in supporter.getInstalledFeatureletIds():
            desc = supporter.getFeatureletDescriptor(i)
            self.addMenuItem(desc['content'][0]['title'],
                             '/'.join((proj_home_url, desc['content'][0]['id'])))
        
        if projectInfoView.projectMembership:
            self.addMenuItem('Project Preferences', '/'.join((proj_home_url, 'base_edit')))

    def menuItems(self):
        """ return a function that indicates what menu items the user should be seeing """
        projectInfoView = zope.component.queryMultiAdapter((self._context[0], self.request), name='project_info')
        memberInfoView = zope.component.queryMultiAdapter((self._context[0], self.request), name='member_info')

        if projectInfoView.inProject:
            self.addProjectView()
        if memberInfoView.inMemberArea():
            if memberInfoView.inPersonalArea():
                self.addPersonalView()
            else:
                self.addMemberView()

        return self.menu_items
