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

"""Protocol buffers for Monorail users."""

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

from protorpc import messages


class IssueUpdateNav(messages.Enum):
  """Pref for where a project member goes after an issue update."""
  UP_TO_LIST = 0       # Back to issue list or grid view.
  STAY_SAME_ISSUE = 1  # Show the same issue with the update.
  NEXT_IN_LIST = 2     # Triage mode: go to next issue, if any.


class User(messages.Message):
  """In-memory busines object for representing users."""
  user_id = messages.IntegerField(1)  # TODO(jrobbins): make it required.

  # Is this user a site administer?
  is_site_admin = messages.BooleanField(4, required=True, default=False)

  # User notification preferences.  These preferences describe when
  # a user is sent a email notification after an issue has changed.
  # The user is notified if either of the following is true:
  # 1. notify_issue_change is True and the user is named in the
  # issue's Owner or CC field.
  # 2. notify_starred_issue_change is True and the user has starred
  # the issue.
  notify_issue_change = messages.BooleanField(5, default=True)
  notify_starred_issue_change = messages.BooleanField(6, default=True)
  # Opt-in to email subject lines like "proj:123: issue summary".
  email_compact_subject = messages.BooleanField(14, default=False)
  # Opt-out of "View Issue" button in Gmail inbox.
  email_view_widget = messages.BooleanField(15, default=True)
  # Opt-in to ping emails from issues that the user starred.
  notify_starred_ping = messages.BooleanField(16, default=False)

  # This user has been banned, and this string describes why. All access
  # to Monorail pages should be disabled.
  banned = messages.StringField(7, default='')

  # Fields 8-13 are no longer used: they were User action counts and limits.

  after_issue_update = messages.EnumField(
      IssueUpdateNav, 29, default=IssueUpdateNav.STAY_SAME_ISSUE)

  # Should we obfuscate the user's email address and require solving a captcha
  # to reveal it entirely? The default value corresponds to requiring users to
  # opt into publishing their identities, but our code ensures that the
  # opposite takes place for Gmail accounts.
  obscure_email = messages.BooleanField(26, default=True)

  # The email address chosen by the user to reveal on the site.
  email = messages.StringField(27)

  # Sticky state for show/hide widget on people details page.
  keep_people_perms_open = messages.BooleanField(33, default=False)

  deleted = messages.BooleanField(39, default=False)
  deleted_timestamp = messages.IntegerField(40, default=0)

  preview_on_hover = messages.BooleanField(42, default=True)

  last_visit_timestamp = messages.IntegerField(45, default=0)
  email_bounce_timestamp = messages.IntegerField(46, default=0)
  vacation_message = messages.StringField(47)

  linked_parent_id = messages.IntegerField(48)
  linked_child_ids = messages.IntegerField(49, repeated=True)


class UserPrefValue(messages.Message):
  """Holds a single non-default user pref."""
  name = messages.StringField(1, required=True)
  value = messages.StringField(2)


class UserPrefs(messages.Message):
  """In-memory business object for representing user preferences."""
  user_id = messages.IntegerField(1, required=True)
  prefs = messages.MessageField(UserPrefValue, 2, repeated=True)



def MakeUser(user_id, email=None, obscure_email=False):
  """Create and return a new user record in RAM."""
  user = User(user_id=user_id, obscure_email=bool(obscure_email))
  if email:
    user.email = email
  return user
