#!/usr/bin/env python

import boto.s3
import sys
import logging

from umobj.bucket import delete_bucket
from umobj.key import delete_key
from umobj.utils import umobj_logging, umobj_init, \
    umobj_get_bucket_key_pair_from_string
from umobj.obj import Obj
from umobj.options import umobj_parser, get_logging_level


if __name__ == "__main__":
    umobj_init()

    description = 'Remove Bucket(s) and Object(s)'
    parser = umobj_parser(description=description)
    parser.add_recursive()
    parser.add_force()
    parser.add_interactive()
    parser.add_s3path(number='+', help='BUCKET:KEY', name='S3PATH')
    args = parser.parse_args()

    umobj_logging(get_logging_level(args))  # set up logging

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

    interactive = True
    if args.force:
        interactive = False
    if args.interactive:
        interactive = True

    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)

    for arg in args.S3PATH:
        bucket_name, key_name = umobj_get_bucket_key_pair_from_string(arg)

        try:
            bucket = Obj.conn.get_bucket(bucket_name)
        except boto.exception.S3ResponseError:
            logging.error("Bucket %s does not exist." % bucket_name)
            sys.exit(1)

        logging.info("Working on bucket %s" % bucket_name)

        if args.recursive:
            # removing all content inside bucket
            if not key_name:
                if interactive:
                    ans = raw_input(' Are you sure you want to remove all ' +
                                    'the contents of the bucket ' +
                                    '\'%s\'? [yes/no] ' % bucket.name).lower()
                    if ans != 'yes':
                        logging.info("Aborting recursive deletion of " +
                                     "bucket %s" % bucket_name)
                        sys.exit(0)
                for key in bucket.list():
                    delete_key(bucket, key.name)

                # removing the bucket itself
                if interactive:
                    ans = raw_input(' Do you want to remove the bucket ' +
                                    '\'%s\'?' % bucket.name +
                                    ' [yes/no] ').lower()
                    if ans != 'yes':
                        logging.info("Not deleting bucket %s" % bucket_name)
                        sys.exit(0)
                delete_bucket(Obj.conn, bucket.name)
                logging.info("Deleting the bucket %s" % bucket_name)
                sys.exit(0)

            # removing a directory
            if interactive:
                for key in bucket.list(prefix=key_name):
                    del_key_ans = raw_input('rmobj: delete \'%s\'? [y/n] ' %
                                            key.name).lower()
                    if del_key_ans != 'y':
                        continue
                    delete_key(bucket, key.name)
            else:
                for key in bucket.list(prefix=key_name):
                    delete_key(bucket, key.name)
        else:  # non-recursive
            if key_name is None:
                logging.error('Can not delete bucket %s, ' % bucket.name +
                              'please use recursive option.')
                sys.exit(1)
            elif key_name.endswith('/'):
                logging.error('Please use the recursive option to delete a ' +
                              'directory.')
            delete_key(bucket, key_name)
