# -*- coding: utf-8 -*- #
# Copyright 2016 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.

"""Helper methods for configuring deployment manager command flags."""

from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals

from googlecloudsdk.api_lib.deployment_manager import dm_api_util
from googlecloudsdk.calliope import arg_parsers
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.util.apis import arg_utils


RESOURCES_AND_OUTPUTS_FORMAT = """
    table(
      resources:format='table(
        name,
        type:wrap,
        update.state.yesno(no="COMPLETED"),
        update.error.errors.group(code),
        update.intent)',
      outputs:format='table(
        name:label=OUTPUTS,
        finalValue:label=VALUE)'
    )
"""

OPERATION_FORMAT = """
    table(
      name,
      operationType:label=TYPE,
      status,
      targetLink.basename():label=TARGET,
      error.errors.group(code),
      warnings.group(code)
    )
"""

DEPLOYMENT_FORMAT = """
    default(
      name, id, description, fingerprint,insertTime, manifest.basename(),
      labels, operation.operationType, operation.progress,
      operation.status, operation.user, operation.endTime, operation.startTime,
      operation.error, operation.warnings, update)
"""

_DELETE_FLAG_KWARGS = {
    'help_str': ('Delete policy for resources that will change as part of '
                 'an update or delete. `delete` deletes the resource while '
                 '`abandon` just removes the resource reference from the '
                 'deployment.'),
    'default': 'delete',
    'name': '--delete-policy'
}


def GetDeleteFlagEnumMap(policy_enum):
  return arg_utils.ChoiceEnumMapper(
      _DELETE_FLAG_KWARGS['name'],
      policy_enum,
      help_str=_DELETE_FLAG_KWARGS['help_str'],
      default=_DELETE_FLAG_KWARGS['default'])


def AddDeploymentNameFlag(parser):
  """Add properties flag."""
  parser.add_argument('deployment_name', help='Deployment name.')


def AddConfigFlags(parser):
  """Add flags for different types of configs."""
  parser.add_argument(
      '--config',
      help='Filename of a top-level yaml config that specifies '
      'resources to deploy. For a guide to creating a configuration, refer '
      'to https://cloud.google.com/deployment-manager/docs/configuration/'
      'create-basic-configuration')

  parser.add_argument(
      '--template',
      help='Filename of a top-level jinja or python config template.')

  parser.add_argument(
      '--composite-type',
      help='Name of a composite type to deploy. For an example of creating '
      'and deploying a composite type, see: https://cloud.google.com/'
      'deployment-manager/docs/configuration/templates/create-composite-types'
      '#examplecompositetype')


def AddPropertiesFlag(parser):
  """Add properties flag."""

  parser.add_argument(
      '--properties',
      help='A comma separated, key:value, map '
      'to be used when deploying a template file or composite type directly.',
      type=arg_parsers.ArgDict(operators=dm_api_util.NewParserDict()),
      dest='properties')


def AddAsyncFlag(parser):
  """Add the async argument."""
  base.ASYNC_FLAG.AddToParser(parser)


def AddFingerprintFlag(parser):
  """Add the fingerprint argument."""
  parser.add_argument(
      '--fingerprint',
      help=('The fingerprint to use in requests to modify a deployment. If not '
            'specified, a get deployment request will be made to fetch the '
            'latest fingerprint. A fingerprint is a randomly generated value '
            'that is part of the update, stop, and cancel-preview request to '
            'perform optimistic locking. It is initially generated by '
            'Deployment Manager and changes after every request to modify '
            'data. The latest fingerprint is printed when deployment data is '
            'modified.'),
      dest='fingerprint')
