# LIBTBX_SET_DISPATCHER_NAME phenix.sculptor
# LIBTBX_SET_DISPATCHER_NAME phaser.sculptor
from phaser import sculptor
from phaser import cli
from phaser import output

parser_default = cli.PCLIParser(
    master_phil = sculptor.PHIL_MASTER,
    description = "Apply user-defined protocol to modify search model",
    usage = "%(prog)s [options] phils"
    )
parser_default.add_argument(
    "-v", "--verbosity",
    action = "store",
    choices = output.SingleStream.LEVEL_FOR.keys(),
    default = "INFO",
    help = "verbosity level"
    )
parser_default.add_argument(
    "--version",
    action = "version",
    version = "%s %s" % ( sculptor.PROGRAM, sculptor.VERSION )
    )

parser_multiprotocol = cli.PCLIParser(
    master_phil = sculptor.PHIL_MULTIPROTOCOL_MASTER,
    description = "Apply predefined protocol to modify search model",
    usage = "%(prog)s [options] phils"
    )
parser_multiprotocol.add_argument(
    "-v", "--verbosity",
    action = "store",
    choices = output.SingleStream.LEVEL_FOR.keys(),
    default = "INFO",
    help = "verbosity level"
    )
parser_multiprotocol.add_argument(
    "--version",
    action = "version",
    version = "%s %s" % ( sculptor.PROGRAM, sculptor.VERSION )
    )

if __name__ == "__main__":
    # Add extra parser for two-level parsing
    setup_for = {
        "flexible": ( parser_default, sculptor.SETUP_DEFAULT ),
        "predefined": ( parser_multiprotocol, sculptor.SETUP_MULTIPROTOCOL ),
        }
    
    parser_central = cli.argparse.ArgumentParser( add_help = False )
    parser_central.add_argument(
        "--mode",
        action = "store",
        choices = setup_for.keys(),
        default = "flexible",
        help = "select to run with user-defined or predefined protocol"
        )
    
    ( interface, remaining ) = parser_central.parse_known_args()
    
    ( parser, setup ) = setup_for[ interface.mode ]
    params = parser.parse_args( args = remaining )
    
    from libtbx.utils import Sorry
    import sys
    
    try:
        sculptor.run(
            args = params.phils,
            out = sys.stdout,
            setup = setup,
            verbosity = output.SingleStream.LEVEL_FOR[ params.verbosity ],
            )
        
    except Sorry:
        raise
    
    except Exception, e:
        print "An internal error has occurred"
        print "The traceback is as follows:"
        import traceback
        print traceback.format_exc()
        print "Terminating..."
        sys.exit( 1 )
