#!/usr/bin/env python

import argparse
import pprint
import json
import sys
import xml.dom.minidom
from mixcoatl import resource

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('basepath', type=str, help='base path')
    parser.add_argument('parameter', nargs='?', default=None, help='query parameter')
    parser.add_argument('--extended', action='store_true', help='set level of API response detail to extended.')
    group_one = parser.add_mutually_exclusive_group()
    group_one.add_argument('--json', action='store_true', help='print API response in JSON format.')
    group_one.add_argument('--xml', action='store_true', help='print API response in XML format.')
    group_two = parser.add_mutually_exclusive_group()
    group_two.add_argument('--statuscode', action='store_true', help='print HTTP status code along with API response.')
    group_two.add_argument('--statuscodeonly', action='store_true', help='print HTTP status code only.')

    cmd_args = parser.parse_args()

    r = resource.Resource(cmd_args.basepath)
    if cmd_args.extended is True:
        r.request_details = 'extended'
    else:
        r.request_details = 'basic'
    if cmd_args.xml is True:
        r.payload_format = 'xml'
    else:
        r.payload_format = 'json'

    p = None if cmd_args.parameter is None else eval(cmd_args.parameter)

    result = r.get(params=p)

    if cmd_args.statuscode:
        print(r.status_code)
    elif cmd_args.statuscodeonly:
        print(r.status_code)
        sys.exit(0)

    if cmd_args.xml is True:
        try:
            print(xml.dom.minidom.parseString(r.last_request.content).toxml())
        except:
            print(result)
    else:
        try:
            data = json.loads(r.last_request.content)        
            print(json.dumps(data, sort_keys=True, indent=2))
        except:
            print(result)
