#!/usr/bin/python

import errno
import logging
import optparse
import re
import subprocess
import sys

import blueprint
from blueprint import context_managers

parser = optparse.OptionParser(
    'Usage: %prog [-P|-C|-S] [-m <message>] [-q] <name>')
parser.add_option('-P', '--puppet',
                  dest='generate',
                  action='store_const',
                  const='puppet',
                  help='generate a Puppet module')
parser.add_option('-C', '--chef',
                  dest='generate',
                  action='store_const',
                  const='chef',
                  help='generate a Chef cookbook')
parser.add_option('-S', '--sh',
                  dest='generate',
                  action='store_const',
                  const='sh',
                  help='generate POSIX shell code')
parser.add_option('-m', '--message',
                  dest='message',
                  default=None,
                  help='commit message')
parser.add_option('-q', '--quiet',
                  dest='quiet',
                  default=False,
                  action='store_true',
                  help='operate quietly')
(options, args) = parser.parse_args()

if options.quiet:
    logging.root.setLevel(logging.CRITICAL)

if 1 != len(args):
    parser.print_usage()
    sys.exit(1)
if re.search(r'[/ \t\r\n]', args[0]):
    logging.error('invalid blueprint name')
    sys.exit(1)
name = args[0]

with context_managers.mkdtemp():
    b = blueprint.Blueprint(name=name, create=True)
    b.commit(options.message or '')

if options.generate is not None:
    try:
        filename = getattr(b, options.generate)().dumpf()
    except OSError as e:
        if errno.EEXIST == e.errno:
            logging.error('{0} already exists'.format(name))
        sys.exit(1)
    if not options.quiet:
        print(filename)
