#!/usr/bin/env python

import json

from jsontester.shell import Script
from jsontester.request import JSONRequest, JSONRequestError, response_code_text


def print_elements(data, element_paths):
    def iterate_element(entry, parts):
        if not parts:
            print(entry)

        elif isinstance(entry, list):
            for e in entry:
                iterate_element(e, parts)

        elif parts[0] in entry:
            iterate_element(entry[parts[0]], parts[1:])

        elif parts[0].count(',')>0:
            for p in parts[0].split(','):
                if p in entry:
                    iterate_element(entry[p], parts[1:])

    for parts in [x.split('.') for x in element_paths]:
        iterate_element(data, parts)


script = Script(description='Send a HTTP GET request to given URL as JSON')
script.add_argument('-r', '--raw', action='store_true', help='No output formatting')
script.add_argument('-i', '--indent', type=int, default=2, help='Result indent level')
script.add_argument('-e', '--element', help='Dict elements to print')
script.add_argument('urls', nargs='*', help='URLs to get')
args = script.parse_args()

request = JSONRequest(browser=args.browser, username=args.username, password=args.password, verify=args.insecure)

if args.element:
    element_paths = args.element.split(',')
else:
    element_paths = None

if args.headers:
    args.headers = dict([(h.split(':')[0], h.split(':')[1].lstrip()) for h in args.headers])
else:
    args.headeres = {}

for url in args.urls:
    script.log.debug('Submitting GET request to {0}'.format(url))

    try:
        res = request.get(url, headers=args.headers)
    except JSONRequestError as e:
        script.exit(1, e)

    res_text = response_code_text(res.status_code)
    if res_text != 'OK':
        script.error('RESPONSE CODE: {0}'.format(res_text))
        script.error('ERROR requesting JSON resource')
        if args.raw:
            script.error(res.content)
        else:
            try:
                script.error(json.dumps(json.loads(res.content), indent=args.indent))
            except ValueError:
                script.error(res.content)
        continue

    if args.debug:
        script.error('RESPONSE CODE: {0}'.format(res_text))

    if res.content.strip():
        if element_paths:
            print_elements(json.loads(res.content), element_paths)
        elif args.raw:
            script.message(res.content)
        else:
            try:
                script.message(json.dumps(json.loads(res.content), indent=args.indent))
            except ValueError:
                script.error(res.content)

