#!/usr/bin/env python
# coding: utf-8

import sys
from pigrate import command, PigrateError
from optparse import OptionParser


def _error_invalid_command(command_name):
    print "'{name}' is not a valid command.".format(name=command_name)
    sys.exit(1)


def _omit_none(options):
    result = {}
    for k, v in options.iteritems():
        if v is None:
            continue
        result[k] = v
    return result


if __name__ == '__main__':
    parser = OptionParser(usage="""
Usage: %prog [options] command [args]

Commands:
  init
  new MIGRATION_NAME
  up
  down
  status
    """.strip())
    parser.add_option('-d', '--dir', dest='basedir',
                      help='schema directory (default :schema)',
                      metavar='DIR', default='schema')
    parser.add_option('-e', '--env', dest='env',
                      help='env (default: local)',
                      metavar='ENV', default='local')
    parser.add_option('-i', '--interactive', dest='interactive',
                      help='prompt before each migration', default=None,
                      action='store_true')
    parser.add_option('--noedit', dest='noedit',
                      help='do not start editor', default=None,
                      action='store_true')
    options, args = parser.parse_args()
    if not args:
        parser.print_help()
        sys.exit(2)
    command_name = args.pop(0)

    if not hasattr(command, command_name):
        _error_invalid_command(command_name)
    command_fn = getattr(command, command_name)
    if not hasattr(command_fn, 'is_command') or not command_fn.is_command:
        _error_invalid_command(command_name)
    try:
        r = command_fn(*args, **_omit_none(options.__dict__))
        sys.exit(r if r is not None else 0)
    except PigrateError as e:
        print >> sys.stderr, 'PigrateError:', e
        sys.exit(-1)
