#!/opt/ansible-runtime/bin/python
#
# Copyright 2014, Rackspace US, Inc.
#
# 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.
#
# (c) 2014, Kevin Carter <kevin.carter@rackspace.com>
# (c) 2015, Major Hayden <major@mhtx.net>
#
"""Returns data about containers and groups in tabular formats."""
import argparse
import json
import prettytable

from osa_toolkit import dictutils as du
from osa_toolkit import filesystem as filesys


def args():
    """Setup argument Parsing."""
    parser = argparse.ArgumentParser(
        usage='%(prog)s',
        description='OpenStack Inventory Generator',
        epilog='Inventory Generator Licensed "Apache 2.0"')

    parser.add_argument(
        '-f',
        '--file',
        help='Inventory file.',
        required=False,
        default='openstack_inventory.json'
    )

    parser.add_argument(
        '-s',
        '--sort',
        help='Sort items based on given key i.e. physical_host',
        required=False,
        default='component'
    )

    exclusive_action = parser.add_mutually_exclusive_group(required=True)
    exclusive_action.add_argument(
        '-r',
        '--remove-item',
        help='host name to remove from inventory, this can be used multiple'
             ' times.',
        action='append',
        default=[]
    )
    exclusive_action.add_argument(
        '-l',
        '--list-host',
        help='',
        action='store_true',
        default=False
    )
    exclusive_action.add_argument(
        '-g',
        '--list-groups',
        help='List groups and containers in each group',
        action='store_true',
        default=False
    )
    exclusive_action.add_argument(
        '-G',
        '--list-containers',
        help='List containers and their groups',
        action='store_true',
        default=False
    )

    exclusive_action.add_argument(
        '-e',
        '--export',
        help='Export group and variable information per host in JSON.',
        action='store_true',
        default=False
    )

    exclusive_action.add_argument(
        '--clear-ips',
        help=('Clears IPs from the existing inventory, but leaves ',
              'all other information intact. LXC interface files and '
              'load balancers will *not* be modified.'),
        action='store_true',
        default=False
    )

    return vars(parser.parse_args())


def get_all_groups(inventory):
    """Retrieve all ansible groups.

    Keyword arguments:
    inventory -- inventory dictionary

    Will return a dictionary of containers as keys and corresponding groups
    as values.
    """
    containers = {}
    for container_name in inventory['_meta']['hostvars'].keys():

        # Skip the default group names since they're not helpful (like aio1).
        if '_' not in container_name:
            continue

        groups = get_groups_for_container(inventory, container_name)
        containers[container_name] = groups

    return containers


def get_groups_for_container(inventory, container_name):
    """Return groups for a particular container.

    Keyword arguments:
    inventory -- inventory dictionary
    container_name -- name of a container to lookup

    Will return a list of groups that the container belongs to.
    """
    # Beware, this dictionary comprehension requires Python 2.7, but we should
    # have this on openstack-ansible hosts already.
    groups = {k for (k, v) in inventory.items() if
              ('hosts' in v and
              container_name in v['hosts'])}
    return groups


def get_containers_for_group(inventory, group):
    """Return containers that belong to a particular group.

    Keyword arguments:
    inventory -- inventory dictionary
    group -- group to use to lookup containers

    Will return a list of containers that belong to a group, or None if no
    containers match the group provided.
    """
    if 'hosts' in inventory[group]:
        containers = inventory[group]['hosts']