#!/usr/bin/env python

import sys
import time
import argparse

from catsnap import Config
from catsnap.image_truck import ImageTruck
from catsnap.document.tag import Tag
from catsnap.document.image import Image
from catsnap.batch.image_batch import get_images
from catsnap.batch.tag_batch import get_tags, add_image_to_tags

from boto.exception import DynamoDBResponseError

def add(args):
    truck = ImageTruck.new_from_something(args.path)
    truck.upload()
    image = Image(truck.calculate_filename(), truck.source_url)
    image.add_tags(args.tags)
    add_image_to_tags(truck.calculate_filename(), args.tags)

    print truck.url(extension=args.extension)

def find(args):
    filenames = set()
    tags = get_tags(args.tags)
    for tag in tags:
        filenames.update(tag['filenames'])
    images = get_images(filenames)
    for image in images:
        filename = image['filename']
        image_tags = ' '.join(image['tags'])
        url = ImageTruck.url_for_filename(filename, extension=args.extension)
        print '%s   |   %s' % (url, image_tags)

def setup(args):
    Tag.create()
    Image.create()
    sys.stdout.write("""
I've created image and tag tables. Dynamodb tables take some time after being
created before they're available for use--please wait a minute to add an image.
""")

def show_help():
    sys.stderr.write(USAGE)
    sys.exit(1)

def main():
    parser = argparse.ArgumentParser(
            description='Store and search for images by tag.')
    parser.add_argument('-e', '--extension', action='store_true',
            help="append '#.gif' to urls (e.g. for pasting in Campfire)")
    subparsers = parser.add_subparsers(help='Actions')

    add_command = subparsers.add_parser('add', help='add an image')
    add_command.add_argument('path', help='url or filename to add')
    add_command.add_argument('tags', nargs='+', help='tags for this image')
    add_command.set_defaults(func=add)

    find_command = subparsers.add_parser('find', help='find an image')
    find_command.add_argument('tags', nargs='+', help='tags to find')
    find_command.set_defaults(func=find)

    setup_command = subparsers.add_parser('setup', help='do first-time setup')
    setup_command.set_defaults(func=setup)

    args = parser.parse_args()
    args.func(args)

try:
    main()
except DynamoDBResponseError, e:
    if e.status == 400 and e.error_code == u'ResourceNotFoundException':
        sys.stderr.write("""
######
I caught a ResourceNotFoundException while trying to interact with DynamoDB.
This may mean that you need to run `catsnap setup`. This can also happen
sometimes right after creating a new DB table--it takes a while before the
table is ready for queries. If you've run setup recently, please wait a bit
and try again...
######
""")
        sys.exit(1)
    else:
        raise

