text: # -*- coding: utf-8 -*- #
  # Copyright 2017 Google LLC. All Rights Reserved.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #    http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  """Shared resource flags for Cloud IoT commands."""
  
  from __future__ import absolute_import
  from __future__ import division
  from __future__ import unicode_literals
  
  from googlecloudsdk.calliope.concepts import concepts
  from googlecloudsdk.command_lib.util.concepts import concept_parsers
  from googlecloudsdk.command_lib.util.concepts import presentation_specs
  
  
  def DeviceAttributeConfig(name='device'):
    return concepts.ResourceParameterAttributeConfig(
        name=name,
        help_text='The device of the {resource}.',
        completion_request_params={'fieldMask': 'name'},
        completion_id_field='id')
  
  
  def RegistryAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name='registry',
        help_text='The device registry for the {resource}.')
  
  
  def RegionAttributeConfig():
    return concepts.ResourceParameterAttributeConfig(
        name='region',
        help_text='The Cloud region for the {resource}.')
  
  
  def GetDeviceResourceSpec(resource_name='device'):
    return concepts.ResourceSpec(
        'cloudiot.projects.locations.registries.devices',
        resource_name=resource_name,
        devicesId=DeviceAttributeConfig(name=resource_name),
        registriesId=RegistryAttributeConfig(),
        locationsId=RegionAttributeConfig(),
        projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
        disable_auto_completers=False)
  
  
  def GetRegistryResourceSpec():
    return concepts.ResourceSpec(
        'cloudiot.projects.locations.registries',
        resource_name='registry',
        registriesId=RegistryAttributeConfig(),
        locationsId=RegionAttributeConfig(),
        projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG,
        disable_auto_completers=False)
  
  
  def GetRegionResourceSpec():
    return concepts.ResourceSpec(
        'cloudiot.projects.locations',
        resource_name='region',
        locationsId=RegionAttributeConfig(),
        projectsId=concepts.DEFAULT_PROJECT_ATTRIBUTE_CONFIG)
  
  
  def AddDeviceResourceArg(parser, verb, positional=True):
    """Add a resource argument for a cloud IOT device.
  
    NOTE: Must be used only if it's the only resource arg in the command.
  
    Args:
      parser: the parser for the command.
      verb: str, the verb to describe the resource, such as 'to update'.
      positional: bool, if True, means that the device ID is a positional rather
        than a flag.
    """
    if positional:
      name = 'device'
    else:
      name = '--device'
    concept_parsers.ConceptParser.ForResource(
        name,
        GetDeviceResourceSpec(),
        'The device {}.'.format(verb),
        required=True).AddToParser(parser)
  
  
  def AddRegistryResourceArg(parser, verb, positional=True):
    """Add a resource argument for a cloud IOT device registry.
  
    NOTE: Must be used only if it's the only resource arg in the command.
  
    Args:
      parser: the parser for the command.
      verb: str, the verb to describe the resource, such as 'to update'.
      positional: bool, if True, means that the device ID is a positional rather
        than a flag.
    """
    if positional:
      name = 'registry'
    else:
      name = '--registry'
    concept_parsers.ConceptParser.ForResource(
        name,
        GetRegistryResourceSpec(),
        'The device registry {}.'.format(verb),
        required=True).AddToParser(parser)
  
  
  def AddRegionResourceArg(parser, verb):
    """Add a resource argument for a cloud IOT region.
  
    NOTE: Must be used only if it's the only resource arg in the command.
  
    Args:
      parser: the parser for the command.
      verb: str, the verb to describe the resource, such as 'to update'.
    """
    concept_parsers.ConceptParser.ForResource(
        '--region',
        GetRegionResourceSpec(),
        'The Cloud region {}.'.format(verb),
        required=True).AddToParser(parser)
  
  
  def CreateDevicePresentationSpec(verb, help_text='The device {}.',
                                   name='device', required=False,
                                   prefixes=True, positional=False):
    """Build ResourcePresentationSpec for generic device Resource.
  
    NOTE: Should be used when there are multiple resources args in the command.
  
    Args:
      verb: string, the verb to describe the resource, such as 'to bind'.
      help_text: string, the help text for the entire resource arg group. Should
        have a format specifier (`{}`) to insert verb.
      name: string, name of resource anchor argument.
      required: bool, whether or not this resource arg is required.
      prefixes: bool, if True the resource name will be used as a prefix for
        the flags in the resource group.
      positional: bool, if True, means that the device ID is a positional rather
        than a flag.
    Returns:
      ResourcePresentationSpec, presentation spec for device.
    """
    arg_name = name if positional else '--' + name
    arg_help = help_text.format(verb)
  
    return presentation_specs.ResourcePresentationSpec(
        arg_name,
        GetDeviceResourceSpec(name),
        arg_help,
        required=required,
        prefixes=prefixes
    )
  
  
  def _GetBindResourceConcepts(verb='to bind to'):
    """Build ConceptParser for (un)bind commands resource args."""
    arg_specs = [
        CreateDevicePresentationSpec(  # gateway spec
            verb,
            help_text='The gateway device {}.',
            name='gateway',
            required=True),
        CreateDevicePresentationSpec(  # device spec
            verb,
            help_text='The device {} the gateway.',
            required=True),
    ]
  
    fallthroughs = {
        '--device.registry': ['--gateway.registry'],
        '--gateway.registry': ['--device.registry']
    }
  
    return concept_parsers.ConceptParser(arg_specs, fallthroughs)
  
  
  def AddBindResourceArgsToParser(parser):
    """Add resource args for gateways (un)bind commands to parser."""
    _GetBindResourceConcepts().AddToParser(parser)
  
  
  def BindAdditionalArgsHook():
    return [_GetBindResourceConcepts()]
  
  
  def UnBindAdditionalArgsHook():
    return [_GetBindResourceConcepts('to unbind from')]
  
  