#!/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|-I] [-m <message>] [-r] [-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('-I', '--ignore',
                  dest='generate',
                  action='store_const',
                  const='ignore',
                  help='show the blueprint\'s ~/.blueprintignore')
parser.add_option('-m', '--message',
                  dest='message',
                  default=None,
                  help='commit message')
parser.add_option('-r', '--relaxed',
                  dest='relaxed',
                  default=False,
                  action='store_true',
                  help='relax version constraints in generated code')
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)
name = args[0]

with context_managers.mkdtemp():
    try:
        b = blueprint.Blueprint(name=name, create=True)
    except blueprint.NameError:
        logging.error('invalid blueprint name')
        sys.exit(1)
    b.commit(options.message or '')

try:
    if options.generate is None:
        pass
    elif 'ignore' == options.generate:
        logging.warning('-I is deprecated, use blueprint-show-ignore instead')
        sys.stdout.write(b.blueprintignore().dumps())
    else:
        try:
            filename = getattr(b, options.generate)(options.relaxed).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)
except IOError:
    pass
