# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Page for showing a user's hotlists."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import ezt

from features import features_bizobj
from features import hotlist_views
from framework import framework_views
from framework import servlet


class UserHotlists(servlet.Servlet):
  """Servlet to display all of a user's hotlists."""

  _PAGE_TEMPLATE = 'features/user-hotlists.ezt'

  def GatherPageData(self, mr):
    viewed_users_hotlists = self.services.features.GetHotlistsByUserID(
        mr.cnxn, mr.viewed_user_auth.user_id)

    viewed_starred_hids = self.services.hotlist_star.LookupStarredItemIDs(
        mr.cnxn, mr.viewed_user_auth.user_id)
    viewed_users_starred_hotlists, _ = self.services.features.GetHotlistsByID(
        mr.cnxn, viewed_starred_hids)

    viewed_users_relevant_hotlists = viewed_users_hotlists + [
        hotlist for hotlist in viewed_users_starred_hotlists.values()
        if hotlist not in viewed_users_hotlists
    ]

    users_by_id = framework_views.MakeAllUserViews(
        mr.cnxn, self.services.user,
        features_bizobj.UsersInvolvedInHotlists(viewed_users_relevant_hotlists))

    views = [hotlist_views.HotlistView(
        hotlist_pb, mr.perms, mr.auth, mr.viewed_user_auth.user_id,
        users_by_id, self.services.hotlist_star.IsItemStarredBy(
            mr.cnxn, hotlist_pb.hotlist_id, mr.auth.user_id))
        for hotlist_pb in viewed_users_relevant_hotlists]

    # visible to viewer, not viewed_user
    visible_hotlists = [view for view in views if view.visible]

    owner_of_hotlists = [hotlist_view for hotlist_view in visible_hotlists
                         if hotlist_view.role_name == 'owner']
    editor_of_hotlists = [hotlist_view for hotlist_view in visible_hotlists
                          if hotlist_view.role_name == 'editor']
    follower_of_hotlists = [hotlist_view for hotlist_view in visible_hotlists
                         if hotlist_view.role_name == '']
    starred_hotlists = [hotlist_view for hotlist_view in visible_hotlists
                        if hotlist_view.hotlist_id in viewed_starred_hids]

    viewed_user_display_name = framework_views.GetViewedUserDisplayName(mr)

    return {
        'user_tab_mode': 'st6',
        'viewed_user_display_name': viewed_user_display_name,
        'owner_of_hotlists': owner_of_hotlists,
        'editor_of_hotlists': editor_of_hotlists,
        'follower_of_hotlists': follower_of_hotlists,
        'starred_hotlists': starred_hotlists,
        'viewing_user_page': ezt.boolean(True),
        }

  def GatherHelpData(self, mr, page_data):
    """Return a dict of values to drive on-page user help.

    Args:
      mr: common information parsed from the HTTP request.
      page_data: Dictionary of base and page template data.

    Returns:
      A dict of values to drive on-page user help, to be added to page_data.
    """
    help_data = super(UserHotlists, self).GatherHelpData(mr, page_data)
    help_data['cue'] = 'explain_hotlist_starring'
    return help_data

  def GetUserHotlistsPage(self, **kwargs):
    return self.handler(**kwargs)

  def PostUserHotlistsPage(self, **kwargs):
    return self.handler(**kwargs)
