#!/usr/bin/env python

from mixcoatl.infrastructure.snapshot import Snapshot
from mixcoatl.admin.billing_code import BillingCode
from mixcoatl import resource_utils, utils
from prettytable import PrettyTable
import argparse
import time
import sys
import os

if __name__ == '__main__':
    """ List snapshots from DCM """
    start = time.time()
    parser = argparse.ArgumentParser()
    region_args = parser.add_mutually_exclusive_group()
    region_args.add_argument('--regionid', '-r', type=int, help="Region ID.")
    region_args.add_argument('--regionpid', '-R', help="Region Provider ID such as us-east-1.")

    group_args = parser.add_mutually_exclusive_group()
    group_args.add_argument("--groupid", "-g", type=int, help="Owning group's group ID.")
    group_args.add_argument("--groupname", "-G", help="Owning group's group name.")

    budget_args = parser.add_mutually_exclusive_group()
    budget_args.add_argument("--budgetid", "-b", type=int, help="Budget ID.")
    budget_args.add_argument("--budgetname", "-B", help="Budget Name.")

    group_two = parser.add_mutually_exclusive_group()
    group_two.add_argument('--json', action='store_true',
        help='print API response in JSON format.')
    group_two.add_argument('--xml', action='store_true',
        help='print API response in XML format.')
    group_two.add_argument('--csv', action='store_true',
        help='print API response in CSV format.')
    cmd_args = parser.parse_args()

    if cmd_args.regionid is not None:
        results = Snapshot.all(region_id=cmd_args.regionid)
    elif cmd_args.regionpid is not None:
        results = Snapshot.all(region_id=resource_utils.get_region_id(cmd_args.regionpid))
    else:
        results = Snapshot.all()

    results = resource_utils.get_snapshots(results, group_id=cmd_args.groupid, budget_id=cmd_args.budgetid)

    if cmd_args.groupname is not None:
        results = resource_utils.get_snapshots(results, group_id=resource_utils.get_group_id(cmd_args.groupname))
    if cmd_args.budgetname is not None:
        results = resource_utils.get_snapshots(results, budget_id=resource_utils.get_budget_id(cmd_args.budgetname))

    if results is None:
        print("There are no snapshots.")
        sys.exit(1)

    if cmd_args.xml is True or cmd_args.json is True or cmd_args.csv is True:
        if cmd_args.xml is True:
            payload_format = "xml"
        elif cmd_args.csv is True:
            payload_format = "csv"
        else:
            payload_format = "json"

        print utils.print_format(results, payload_format)
    else:
        table = PrettyTable(["Snapshot ID", "Provider ID", "Snapshot Name", "Group", "Budget", "Date"])
        budget_name_cache = dict()
        for r in results:
            if not budget_name_cache.has_key(r.budget):
                budget_name_cache[r.budget] = BillingCode(r.budget).name
            budget_name = budget_name_cache[r.budget]
            table.add_row([r.snapshot_id,
                            r.provider_id,
                            r.name,
                            r.owning_groups[0]['name'] if hasattr(r, 'owning_groups') else None, 
                            budget_name,
                            r.created_timestamp])
        table.align = 'l'
        print(table)

    if 'DCM_DEBUG' in os.environ:
        print 'Results returned in', time.time()-start, 'seconds.'
