# Copyright 2020 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 framework import permissions
from framework import exceptions
from api.v3.api_proto import permission_objects_pb2

# Global dictionaries to map backend permission strings to
# API Permission enum values.

HOTLIST_PERMISSIONS_MAP = {
    permissions.EDIT_HOTLIST:
        permission_objects_pb2.Permission.Value('HOTLIST_EDIT'),
    permissions.ADMINISTER_HOTLIST:
        permission_objects_pb2.Permission.Value('HOTLIST_ADMINISTER')
}

FIELDDEF_PERMISSIONS_MAP = {
    permissions.EDIT_FIELD_DEF:
        permission_objects_pb2.Permission.Value('FIELD_DEF_EDIT'),
    permissions.EDIT_FIELD_DEF_VALUE:
        permission_objects_pb2.Permission.Value('FIELD_DEF_VALUE_EDIT')
}

# TODO(crbug/monorail/7339): Create a common _ConvertPermissions(permissions,
# permissions_map)


def ConvertHotlistPermissions(hotlist_permissions):
  # type: (Sequence[str]) -> Sequence[permission_objects_pb2.Permission]
  """Converts hotlist permission strings into protoc Permission enum values."""
  api_permissions = []
  for permission in hotlist_permissions:
    api_permission = HOTLIST_PERMISSIONS_MAP.get(permission)
    if not api_permission:
      raise exceptions.InputException(
          'Unrecognized hotlist permission: %s' % permission)
    api_permissions.append(api_permission)

  return api_permissions


def ConvertFieldDefPermissions(field_permissions):
  # type: (Sequence[str]) -> Sequence[permission_objects_pb2.Permission]
  """Converts field permission strings into protoc Permission enum values."""
  api_permissions = []
  for permission in field_permissions:
    api_permission = FIELDDEF_PERMISSIONS_MAP.get(permission)
    if not api_permission:
      raise exceptions.InputException(
          'Unrecognized field permission: %s' % permission)
    api_permissions.append(api_permission)

  return api_permissions


# TODO(crbug/monorail/7339): Implement all ConvertFooPermissions methods.
