# 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.

"""Helper functions used in user group modules."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

from framework import framework_views
from mrproto import usergroup_pb2


class GroupVisibilityView(object):
  """Object for group visibility information that can be easily used in EZT."""

  VISIBILITY_NAMES = {
      usergroup_pb2.MemberVisibility.ANYONE: 'Anyone on the Internet',
      usergroup_pb2.MemberVisibility.MEMBERS: 'Group Members',
      usergroup_pb2.MemberVisibility.OWNERS: 'Group Owners'}

  def __init__(self, group_visibility_enum):
    self.key = int(group_visibility_enum)
    self.name = self.VISIBILITY_NAMES[group_visibility_enum]


class GroupTypeView(object):
  """Object for group type information that can be easily used in EZT."""

  TYPE_NAMES = {
      usergroup_pb2.GroupType.CHROME_INFRA_AUTH: 'Chrome-infra-auth',
      usergroup_pb2.GroupType.MDB: 'MDB',
      usergroup_pb2.GroupType.BAGGINS: 'Baggins',
      usergroup_pb2.GroupType.COMPUTED: 'Computed',
      }

  def __init__(self, group_type_enum):
    self.key = int(group_type_enum)
    self.name = self.TYPE_NAMES[group_type_enum]


class GroupMemberView(framework_views.UserView):
  """Wrapper class to display basic group member information in a template."""

  def __init__(self, user, group_id, role):
    assert role in ['member', 'owner']
    super(GroupMemberView, self).__init__(user)
    self.group_id = group_id
    self.role = role


def BuildUserGroupVisibilityOptions():
  """Return a list of user group visibility values for use in an HTML menu.

  Returns:
    A list of GroupVisibilityView objects that can be used in EZT.
  """
  vis_levels = [usergroup_pb2.MemberVisibility.OWNERS,
                usergroup_pb2.MemberVisibility.MEMBERS,
                usergroup_pb2.MemberVisibility.ANYONE]

  return [GroupVisibilityView(vis) for vis in vis_levels]


def BuildUserGroupTypeOptions():
  """Return a list of user group types for use in an HTML menu.

  Returns:
    A list of GroupTypeView objects that can be used in EZT.
  """
  group_types = [usergroup_pb2.GroupType.CHROME_INFRA_AUTH,
                 usergroup_pb2.GroupType.MDB,
                 usergroup_pb2.GroupType.BAGGINS,
                 usergroup_pb2.GroupType.COMPUTED]

  return sorted([GroupTypeView(gt) for gt in group_types],
                key=lambda gtv: gtv.name)
