#!/usr/bin/env python

import json
import sys
from optparse import OptionParser

import microsecrets

def main():

    usage = """%prog [options] COMMAND...

Download environment variables and files from S3.

The JSON environment file should contain a dictionary with this key:
    'environment': a dictionary of environment variable & value pairs

Example usage:

    Download environment for `testservice' from `mybucket'
    $ %prog -b mybucket -s testservice -c e3b0c44298fc1c1...

    Download file train.txt for `testservice' from `mybucket'
    $ %prog -b mybucket -s testservice -f train.txt

    List latest versions of all uploaded files
    $ %prog -b mybucket -s testservice --list

""".rstrip()

    parser = OptionParser(usage=usage,
                          version='microsecrets ' + microsecrets.VERSION)

    parser.add_option('-v', '--verbose', action='store_true',
                      help='Enable verbose log messages')

    parser.add_option('-d', '--debug', action='store_true',
                      help='Enable debugging log messages')

    parser.add_option('-r', '--region', dest='region', default='us-east-1',
                      help='Connect to REGION in S3')

    parser.add_option('-b', '--bucket', dest='bucket',
                      help='Connect to BUCKET in S3')

    parser.add_option('-s', '--service', dest='service',
                      help='Name of the service (determines S3 path)')

    parser.add_option('-c', '--checksum', dest='checksum', metavar='HASH',
                      help=('Checksum (SHA1/SHA256) of JSON environment file '
                            'to verify. Implies --whitelist-all.'))

    parser.add_option('-f', '--file', dest='files', action='append',
                      metavar='NAME[:PATH[:HASH]]',
                      help=('Download S3 file with NAME to destination PATH, '
                            'verify with HASH (may be passed multiple times)'))

    parser.add_option('-l', '--list', action='store_true',
                      help='List latest files instead of downloading')

    opts, args = parser.parse_args()

    if opts.verbose:
        microsecrets.set_log_verbose_mode()

    if opts.debug:
        microsecrets.set_log_debug_mode()

    command = args

    if command:
        parser.print_help()
        sys.stderr.write('error: unexpected extra arguments\n')
        return 1

    if not opts.bucket:
        parser.print_help()
        sys.stderr.write('error: must provide -b / --bucket for S3 bucket\n')
        return 1

    if opts.checksum and not opts.env_whitelist:
        opts.env_whitelist_all = True

    m = microsecrets.Microsecrets(region_name=opts.region,
                                  bucket_name=opts.bucket,
                                  service_name=opts.service)

    if opts.list:
        for obj in m.list_files_and_env():
            print obj.key
        return 0

    # TODO: break this out into a separate CLI
    if opts.files:
        files = [m.parse_file_arg(string, require_path=False) for string in
                 opts.files]

        for f_info in files:
            m.download_s3_file(name=f_info['name'],
                               dest_path=f_info['path'],
                               dest_stream=(sys.stdout if f_info['path'] is
                                            None else None),
                               checksum=f_info['checksum'])

    env = m._download_s3_environment(checksum=opts.checksum,
                                     env_whitelist_all=True,
                                     include_metadata=False)

    json.dump(env, sys.stdout, indent=2)
    sys.stdout.write('\n')
    sys.stdout.flush()

    return 0

if __name__ == '__main__':
    sys.exit(main())
