<filename>ebcli/operations/lifecycleops.py
# Copyright 2016 Amazon.com, Inc. or its affiliates. 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. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file 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.
from cement.utils.misc import minimal_logger

from ebcli.lib import elasticbeanstalk, aws
from ebcli.core import fileoperations, io
from ebcli.objects.lifecycleconfiguration import LifecycleConfiguration
from ebcli.objects.exceptions import InvalidSyntaxError
from ebcli.resources.strings import strings

LOG = minimal_logger(__name__)
SPACER = ' ' * 2
NO_ITEM_TOKEN = '-'


def print_lifecycle_policy(app_name):
    application = elasticbeanstalk.describe_application(app_name)
    region = aws.get_region_name()

    io.echo('Application details for:', app_name)
    io.echo('{0}Region:'.format(SPACER), region)
    io.echo('{0}Description:'.format(SPACER), getattr(application, 'Description', NO_ITEM_TOKEN))
    io.echo('{0}Date Created:'.format(SPACER), application['DateCreated'].strftime("%Y/%m/%d %H:%M %Z"))
    io.echo('{0}Date Updated:'.format(SPACER), application['DateUpdated'].strftime("%Y/%m/%d %H:%M %Z"))
    io.echo('{0}Application Versions:'.format(SPACER), getattr(application, 'Versions', NO_ITEM_TOKEN))
    io.echo('{0}Resource Lifecycle Config(s):'.format(SPACER))
    resource_configs = application['ResourceLifecycleConfig']
    recursive_print_api_dict(resource_configs)


def recursive_print_api_dict(config, spaced=2):
    for entry in config:
        entry_value = config[u'{0}'.format(entry)]
        if isinstance(entry_value, dict):
            io.echo('{0}{1}:'.format(SPACER * spaced, entry))
            recursive_print_api_dict(entry_value, spaced + 1)
        else:
            io.echo('{0}{1}: {2}'.format(SPACER * spaced, entry, entry_value))


def interactive_update_lifcycle_policy(app_name):
    api_model = elasticbeanstalk.describe_application(app_name)

    lifecycle_config = LifecycleConfiguration(api_model)
    usr_model = lifecycle_config.convert_api_to_usr_model()

    file_location = fileoperations.save_app_file(usr_model)
    fileoperations.open_file_for_editing(file_location)

    try:
        usr_model = fileoperations.get_application_from_file(app_name)
        config_changes = lifecycle_config.collect_changes(usr_model)
        fileoperations.delete_app_file(app_name)
    except InvalidSyntaxError:
        io.log_error(strings['lifecycle.invalidsyntax'])
        fileoperations.delete_app_file(app_name)
        return

    if not config_changes:
        io.log_warning(strings['lifecycle.updatenochanges'])
        return

    elasticbeanstalk.update_application_resource_lifecycle(app_name, config_changes)
    io.echo(strings['lifecycle.success'])
