# Copyright 2014 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.
import sys

from awscli.customizations.commands import BasicCommand


def register_get_status(cli):
    cli.register('building-command-table.configservice', add_get_status)


def add_get_status(command_table, session, **kwargs):
    command_table['get-status'] = GetStatusCommand(session)


class GetStatusCommand(BasicCommand):
    NAME = 'get-status'
    DESCRIPTION = (
        'Reports the status of all of configuration '
        'recorders and delivery channels.'
    )

    def __init__(self, session):
        self._config_client = None
        super(GetStatusCommand, self).__init__(session)

    def _run_main(self, parsed_args, parsed_globals):
        self._setup_client(parsed_globals)
        self._check_configuration_recorders()
        self._check_delivery_channels()
        return 0

    def _setup_client(self, parsed_globals):
        client_args = {
            'verify': parsed_globals.verify_ssl,
            'region_name': parsed_globals.region,
            'endpoint_url': parsed_globals.endpoint_url,
        }
        self._config_client = self._session.create_client(
            'config', **client_args
        )

    def _check_configuration_recorders(self):
        status = self._config_client.describe_configuration_recorder_status()
        sys.stdout.write('Configuration Recorders:\n\n')
        for configuration_recorder in status['ConfigurationRecordersStatus']:
            self._check_configure_recorder_status(configuration_recorder)
            sys.stdout.write('\n')

    def _check_configure_recorder_status(self, configuration_recorder):
        # Get the name of the recorder and print it out.
        name = configuration_recorder['name']
        sys.stdout.write('name: %s\n' % name)

        # Get the recording status and print it out.
        recording = configuration_recorder['recording']
        recording_map = {False: 'OFF', True: 'ON'}
        sys.stdout.write('recorder: %s\n' % recording_map[recording])

        # If the recorder is on, get the last status and print it out.
        if recording:
            self._check_last_status(configuration_recorder)

    def _check_delivery_channels(self):
        status = self._config_client.describe_delivery_channel_status()
        sys.stdout.write('Delivery Channels:\n\n')
        for delivery_channel in status['DeliveryChannelsStatus']:
            self._check_delivery_channel_status(delivery_channel)
            sys.stdout.write('\n')

    def _check_delivery_channel_status(self, delivery_channel):
        # Get the name of the delivery channel and print it out.
        name = delivery_channel['name']
        sys.stdout.write('name: %s\n' % name)

        # Obtain the various delivery statuses.
        stream_delivery = delivery_channel['configStreamDeliveryInfo']
        history_delivery = delivery_channel['configHistoryDeliveryInfo']
        snapshot_delivery = delivery_channel['configSnapshotDeliveryInfo']

        # Print the statuses out if they exist.
        if stream_delivery:
            self._check_last_status(stream_delivery, 'stream delivery ')
        if history_delivery:
            self._check_last_status(history_delivery, 'history delivery ')
        if snapshot_delivery:
            self._check_last_status(snapshot_delivery, 'snapshot delivery ')

    def _check_last_status(self, status, status_name=''):
        last_status = status['lastStatus']
        sys.stdout.write('last %sstatus: %s\n' % (status_name, last_status))
        if last_status == "FAILURE":
            sys.stdout.write('error code: %s\n' % status['lastErrorCode'])
            sys.stdout.write('message: %s\n' % status['lastErrorMessage'])
