#!/usr/bin/env python
"""
Upload a file to S3
"""

from sys import argv, stdout
from time import time
from os.path import basename
from optparse import OptionParser

from boto.s3.key import Key
from boto.s3.connection import S3Connection


def uploadFile( filename, dest=None, bucket=None, overwrite=False ):
    "Upload a file to a bucket"
    if not bucket:
        bucket = 'onos'
    if not dest: 
        key = basename( filename )
    else:
        key = dest + basename( filename ) #FIXME add the /
    print '* Uploading', filename, 'to bucket', bucket, 'as', key
    stdout.flush()
    start = time()
    def callback( transmitted, size ):
        "Progress callback for set_contents_from_filename"
        elapsed = time() - start
        percent = 100.0 * transmitted / size
        kbps = .001 * transmitted / elapsed
        print ( '\r%d bytes transmitted of %d (%.2f%%),'
                ' %.2f KB/sec ' %
                ( transmitted, size, percent, kbps ) ),
        stdout.flush()
    conn = S3Connection()
    bucket = conn.get_bucket( bucket )
    k = Key( bucket )
    k.key = key
    if overwrite or not k.exists():
        k.set_contents_from_filename( filename, cb=callback, num_cb=100 )
        print
        elapsed = time() - start
        print "* elapsed time: %.2f seconds" % elapsed
    else:
        print 'file', basename( filename ), 'already exists in', bucket.name

if __name__ == '__main__':
    usage = "Usage: %prog [options] <file to upload>"
    parser = OptionParser(usage=usage)
    parser.add_option("-b", "--bucket", dest="bucket",
                      help="Bucket on S3")
    parser.add_option("-d", "--dest", dest="dest",
                      help="Destination path in bucket")
    parser.add_option("-k", "--key", dest="awsKey",
                      help="Bucket on S3")
    parser.add_option("-s", "--secret", dest="awsSecret",
                      help="Bucket on S3")
    parser.add_option("-f", "--force", dest="overwrite",
                      help="Overwrite existing file")
    (options, args) = parser.parse_args()
    
    if len( args ) == 0:
        parser.error("missing filenames")
    for file in args:
        uploadFile( file, options.dest, options.bucket, options.overwrite )

    #FIXME key and secret are unused
