#!/usr/bin/env python

import sys
import logging
import boto.s3

from umobj.utils import umobj_logging, umobj_init, \
    umobj_get_bucket_key_pair_from_string
from umobj.transfer import obj_key
from umobj.obj import Obj
from umobj.options import umobj_parser, get_logging_level


if __name__ == "__main__":
    umobj_init()

    description = 'Cat objects from the object store'
    parser = umobj_parser(description=description)
    parser.add_s3path(name='SOURCE', number=1,
                      help='BUCKET:KEY')
    args = parser.parse_args()

    umobj_logging(get_logging_level(args))  # set up logging

    logging.info("Running %s" % sys.argv)

    if not Obj.connect(host=args.host,
                       port=args.port,
                       access_key=args.access_key,
                       secret_key=args.secret_key):
        logging.error('Unable to contact object store.')
        sys.exit(1)

    src = args.SOURCE[0]
    bucket_name, key_name = \
        umobj_get_bucket_key_pair_from_string(src)

    if not bucket_name or not key_name:
        logging.error("You need to provide a bucket:key to cat.")
        parser.print_help()
        sys.exit(2)

    logging.debug("SRC Bucket Name: %s" % bucket_name)
    logging.debug("SRC Key Name: %s" % key_name)

    try:
        bucket = Obj.conn.get_bucket(bucket_name)
    except boto.exception.S3ResponseError as e:
        logging.error("Unable to access bucket %s: %s." %
                      (bucket_name, e.error_code))
        sys.exit(3)

    key = obj_key(bucket_name, key_name)
    if key:
        for buffered_bytes in key:
            sys.stdout.write(buffered_bytes)
    else:
        logging.error('No such key %s' % src)
        sys.exit(4)
