#!/usr/bin/env python3
# Tools to easily create, update, remove objects
import requests
import argparse

GET_URL = 'http://localhost:5000/api/%s/%d/'
LIST_URL = 'http://localhost:5000/api/%s/'
DELETE_URL = GET_URL
CREATE_URL = LIST_URL


def _return_error(r):
    return 'server response code %d\n%s' % (r.status_code, r.content)


def list_handler(collection):
    r = requests.get(LIST_URL % collection)
    if r.status_code != 200:
        return _return_error(r)
    return '\n'.join([str(doc) for doc in r.json()])


def get_handler(collection, pk):
    r = requests.get(GET_URL % (collection, pk))
    if r.status_code != 200:
        return _return_error(r)
    return r.json()


def create_handler(collection, raw_body):
    body = {}

    for item in raw_body:
        try:
            key, value = item.split('=')
            body[key] = value
        except ValueError:
            return 'invalid body items'

    for key, value in body.items():
        print(key + ':', value)

    response = input('Are you sure? Y/n: ')
    while response not in ('', 'n', 'y', 'Y', 'N'):
        response = input('Are you sure? Y/n: ')

    if response in ['', 'Y', 'y']:
        r = requests.post(CREATE_URL % collection, json=body)
        if r.status_code == 200:
            return r.content
        return _return_error(r)
    else:
        return 'aborted'


def delete_handler(collection, pk):
    url = DELETE_URL % (collection, pk)
    r = requests.delete(url)

    if r.status_code == 200:
        return 'ok'
    return _return_error(r)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    subparsers = parser.add_subparsers(dest='action')

    list_parser = subparsers.add_parser('list')
    list_parser.add_argument('collection')

    get_parser = subparsers.add_parser('get')
    get_parser.add_argument('collection')
    get_parser.add_argument('pk', type=int)

    delete_parser = subparsers.add_parser('delete')
    delete_parser.add_argument('collection')
    delete_parser.add_argument('pk', type=int)

    create_parser = subparsers.add_parser('create')
    create_parser.add_argument('collection')
    create_parser.add_argument('body', nargs='*')

    args = parser.parse_args()

    if args.action == 'delete':
        print(delete_handler(args.collection, args.pk))
    elif args.action == 'create':
        print(create_handler(args.collection, args.body))
    elif args.action == 'list':
        print(list_handler(args.collection))
    elif args.action == 'get':
        print(get_handler(args.collection, args.pk))
