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

from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

from api import converters
from api import monorail_servicer
from api import converters
from api.api_proto import users_pb2
from api.api_proto import users_prpc_pb2
from api.api_proto import user_objects_pb2
from businesslogic import work_env
from framework import authdata
from framework import framework_views
from framework import permissions

class UsersServicer(monorail_servicer.MonorailServicer):
  """Handle API requests related to User objects.

  Each API request is implemented with a method as defined in the
  .proto file that does any request-specific validation, uses work_env
  to safely operate on business objects, and returns a response proto.
  """

  DESCRIPTION = users_prpc_pb2.UsersServiceDescription

  @monorail_servicer.PRPCMethod
  def GetUser(self, mc, request):
    """Return info about the specified user."""
    with work_env.WorkEnv(mc, self.services) as we:
      users, linked_user_ids = we.ListReferencedUsers(
          [request.user_ref.display_name])
      linked_user_views = framework_views.MakeAllUserViews(
          mc.cnxn, self.services.user, linked_user_ids)

    with mc.profiler.Phase('converting to response objects'):
      response_users = converters.ConvertUsers(users, linked_user_views)

    return response_users[0]

  @monorail_servicer.PRPCMethod
  def ListReferencedUsers(self, mc, request):
    """Return the list of existing users in a response proto."""
    emails = request.emails
    if request.user_refs:
      emails = [user_ref.display_name for user_ref in request.user_refs]
    with work_env.WorkEnv(mc, self.services) as we:
      users, linked_user_ids = we.ListReferencedUsers(emails)
      linked_user_views = framework_views.MakeAllUserViews(
          mc.cnxn, self.services.user, linked_user_ids)

    with mc.profiler.Phase('converting to response objects'):
      response_users = converters.ConvertUsers(users, linked_user_views)
      response = users_pb2.ListReferencedUsersResponse(users=response_users)

    return response

  @monorail_servicer.PRPCMethod
  def GetMemberships(self, mc, request):
    """Return the user groups for the given user visible to the requester."""
    user_id = converters.IngestUserRef(
        mc.cnxn, request.user_ref, self.services.user)

    with work_env.WorkEnv(mc, self.services) as we:
      group_ids = we.GetMemberships(user_id)

    with mc.profiler.Phase('converting to response objects'):
      groups_by_id = framework_views.MakeAllUserViews(
          mc.cnxn, self.services.user, group_ids)
      group_refs = converters.ConvertUserRefs(
          group_ids, [], groups_by_id, True)

      return users_pb2.GetMembershipsResponse(group_refs=group_refs)

  @monorail_servicer.PRPCMethod
  def GetUserStarCount(self, mc, request):
    """Return the star count for a given user."""
    user_id = converters.IngestUserRef(
        mc.cnxn, request.user_ref, self.services.user)

    with work_env.WorkEnv(mc, self.services) as we:
      star_count = we.GetUserStarCount(user_id)

    result = users_pb2.GetUserStarCountResponse(star_count=star_count)
    return result

  @monorail_servicer.PRPCMethod
  def StarUser(self, mc, request):
    """Star a given user."""
    user_id = converters.IngestUserRef(
        mc.cnxn, request.user_ref, self.services.user)

    with work_env.WorkEnv(mc, self.services) as we:
      we.StarUser(user_id, request.starred)
      star_count = we.GetUserStarCount(user_id)

    result = users_pb2.StarUserResponse(star_count=star_count)
    return result

  @monorail_servicer.PRPCMethod
  def SetExpandPermsPreference(self, mc, request):
    """Set a users preference on whether to expand perms by default."""
    with work_env.WorkEnv(mc, self.services) as we:
      we.UpdateUserSettings(
          mc.auth.user_pb, keep_people_perms_open=request.expand_perms)

    result = users_pb2.SetExpandPermsPreferenceResponse()
    return result

  def _SignedInOrSpecifiedUser(self, mc, request):
    """If request specifies a user, return it.  Otherwise signed-in user."""
    user_id = mc.auth.user_id
    if request.HasField('user_ref'):
      user_id = converters.IngestUserRef(
          mc.cnxn, request.user_ref, self.services.user)
    return user_id

  @monorail_servicer.PRPCMethod
  def GetSavedQueries(self, mc, request):
    """Get a user's saved queries."""
    user_id = self._SignedInOrSpecifiedUser(mc, request)

    # Only site admins can view other user's saved queries.
    if user_id != mc.auth.user_id and not mc.auth.user_pb.is_site_admin:
      raise permissions.PermissionException(
        'You are not allowed to view this user\'s saved queries')

    saved_queries = self.services.features.GetSavedQueriesByUserID(
        mc.cnxn, user_id)
    return users_pb2.GetSavedQueriesResponse(
        saved_queries=converters.IngestSavedQueries(mc.cnxn,
            self.services.project, saved_queries))

  @monorail_servicer.PRPCMethod
  def GetUserPrefs(self, mc, request):
    """Get a user's preferences."""
    with work_env.WorkEnv(mc, self.services) as we:
      userprefs = we.GetUserPrefs(self._SignedInOrSpecifiedUser(mc, request))

    result = users_pb2.GetUserPrefsResponse(
        prefs=converters.ConvertPrefValues(userprefs.prefs))
    return result

  @monorail_servicer.PRPCMethod
  def SetUserPrefs(self, mc, request):
    """Add to or set a users preferences."""
    with work_env.WorkEnv(mc, self.services) as we:
      pref_values = converters.IngestPrefValues(request.prefs)
      we.SetUserPrefs(self._SignedInOrSpecifiedUser(mc, request), pref_values)

    result = users_pb2.SetUserPrefsResponse()
    return result

  @monorail_servicer.PRPCMethod
  def InviteLinkedParent(self, mc, request):
    """Create a linked account invite."""
    with work_env.WorkEnv(mc, self.services) as we:
      we.InviteLinkedParent(request.email)

    result = users_pb2.InviteLinkedParentResponse()
    return result

  @monorail_servicer.PRPCMethod
  def AcceptLinkedChild(self, mc, request):
    """Link a child account that has invited this account as parent."""
    child_id = self.services.user.LookupUserID(mc.cnxn, request.email)
    with work_env.WorkEnv(mc, self.services) as we:
      we.AcceptLinkedChild(child_id)

    result = users_pb2.AcceptLinkedChildResponse()
    return result

  @monorail_servicer.PRPCMethod
  def UnlinkAccounts(self, mc, request):
    """Unlink a specificed parent and child account."""
    parent_id, child_id = converters.IngestUserRefs(
        mc.cnxn, [request.parent, request.child], self.services.user)
    with work_env.WorkEnv(mc, self.services) as we:
      we.UnlinkAccounts(parent_id, child_id)

    result = users_pb2.UnlinkAccountsResponse()
    return result

  @monorail_servicer.PRPCMethod
  def GetUsersProjects(self, mc, request):
    user_ids = converters.IngestUserRefs(
        mc.cnxn, request.user_refs, self.services.user)
    user_auths = [
        authdata.AuthData.FromUserID(mc.cnxn, user_id, self.services)
        for user_id in user_ids]

    result = users_pb2.GetUsersProjectsResponse()
    with work_env.WorkEnv(mc, self.services) as we:
      for user_ref, auth in zip(request.user_refs, user_auths):
        starred = we.ListStarredProjects(auth.user_id)
        owner, _archived, member, contrib = we.GetUserProjects(
            auth.effective_ids)
        user_projects = result.users_projects.add()
        user_projects.user_ref.CopyFrom(user_ref)
        user_projects.owner_of.extend(p.project_name for p in owner)
        user_projects.member_of.extend(p.project_name for p in member)
        user_projects.contributor_to.extend(p.project_name for p in contrib)
        user_projects.starred_projects.extend(p.project_name for p in starred)

    return result

  @monorail_servicer.PRPCMethod
  def ExpungeUser(self, mc, request):
    with work_env.WorkEnv(mc, self.services) as we:
      we.ExpungeUsers([request.email])

    response = users_pb2.ExpungeUserResponse()
    return response
