#!/usr/bin/env python

import platform
import sys
from optparse import OptionParser

import microsecrets

def main():

    usage = """%prog [options] [FILE]

Upload environment variables to S3. --bucket and --service are required.

Read from FILE a list of environment variable name=value pairs, one per line.
If no FILE is given, read from stdin, end with an EOF (CTRL-D on *nix, CTRL-Z
on Windows).

Example usage:

    Upload environment variables from env.txt to mybucket
    $ %prog -b mybucket -s testservice env.txt

    Upload environment variables passed on stdin
    $ %prog -b mybucket -s testservice <<EOM
    EDITOR=vim
    DB_URL=db://example.com:123
    EOM

""".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('-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('-j', '--json', action='store_true',
                      help='Provide input as JSON rather than key=value pairs')

    opts, args = parser.parse_args()

    if opts.verbose:
        microsecrets.set_log_verbose_mode()

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

    if not opts.bucket:
        parser.print_help()
        sys.stderr.write('\nerror: must provide -s/--service name\n')
        return 1

    if len(args) > 1:
        parser.print_help()
        return 1

    if opts.json:
        in_format = 'JSON dict'
    else:
        in_format = 'KEY=value pairs'

    if args:
        filename = args[0]
        handle = open(filename, 'r')
    else:
        handle = sys.stdin
        if sys.stdin.isatty():
            if platform.system() == 'Windows':
                eof = 'CTRL-Z'
            else:
                eof = 'CTRL-D'
            sys.stderr.write('Reading {} from stdin, end with {}...\n'.format(
                in_format, eof))

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

    r_dict = m.upload_environment_from_stream(handle, json_input=opts.json)

    print 'Successfully uploaded environment file to S3:'
    print '  bucket:', r_dict['bucket']
    print '  path:', r_dict['key']
    print '  checksum:', r_dict['digest']

    return 0

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