#!/usr/bin/env python

import optparse, sys, os, pprint
import MetagenomeDB as mdb

p = optparse.OptionParser(description = """Part of the MetagenomeDB toolkit.
Copy the current database.""")

p.add_option("--target-db", dest = "target_db", metavar = "STRING",
	help = "Name of the copy (mandatory).")

p.add_option("-f", "--force-copy", dest = "force_copy", action = "store_true", default = False,
	help = "Force the copy if the target database already exists.")

admin_connection_parameters = {}
def declare_admin_connection_parameter (option, opt, value, parser):
	admin_connection_parameters[opt[2:].replace('-', '_')] = value

p.add_option("--admin-user", dest = "admin_user", metavar = "STRING",
	type = "string", action = "callback", callback = declare_admin_connection_parameter,
	help = """Admin user for the MongoDB server connection (optional). Default:
'user' property in ~/.MetagenomeDB, or none if not found.""")

p.add_option("--admin-password", dest = "admin_password", metavar = "STRING",
	type = "string", action = "callback", callback = declare_admin_connection_parameter,
	help = """Admin password for the MongoDB server connection (optional). Default:
'password' property in ~/.MetagenomeDB, or none if not found.""")

p.add_option("-v", "--verbose", dest = "verbose", action = "store_true", default = False)
p.add_option("--version", dest = "display_version", action = "store_true", default = False)

g = optparse.OptionGroup(p, "Connection")

connection_parameters = {}
def declare_connection_parameter (option, opt, value, parser):
	connection_parameters[opt[2:]] = value

g.add_option("--host", dest = "connection_host", metavar = "HOSTNAME",
	type = "string", action = "callback", callback = declare_connection_parameter,
	help = """Host name or IP address of the MongoDB server (optional). Default:
'host' property in ~/.MetagenomeDB, or 'localhost' if not found.""")

g.add_option("--port", dest = "connection_port", metavar = "INTEGER",
	type = "string", action = "callback", callback = declare_connection_parameter,
	help = """Port of the MongoDB server (optional). Default: 'port' property
in ~/.MetagenomeDB, or 27017 if not found.""")

g.add_option("--db", dest = "connection_db", metavar = "STRING",
	type = "string", action = "callback", callback = declare_connection_parameter,
	help = """Name of the database in the MongoDB server (optional). Default:
'db' property in ~/.MetagenomeDB, or 'MetagenomeDB' if not found.""")

g.add_option("--user", dest = "connection_user", metavar = "STRING",
	type = "string", action = "callback", callback = declare_connection_parameter,
	help = """User for the MongoDB server connection (optional). Default:
'user' property in ~/.MetagenomeDB, or none if not found.""")

g.add_option("--password", dest = "connection_password", metavar = "STRING",
	type = "string", action = "callback", callback = declare_connection_parameter,
	help = """Password for the MongoDB server connection (optional). Default:
'password' property in ~/.MetagenomeDB, or none if not found.""")

p.add_option_group(g)

(p, a) = p.parse_args()

def error (msg):
	if str(msg).endswith('.'):
		msg = str(msg)[:-1]
	print >>sys.stderr, "ERROR: %s." % msg
	sys.exit(1)

if (p.display_version):
	print mdb.version
	sys.exit(0)

if (p.target_db == None):
	error("A target database name must be provided")

admin_connection_parameters["target_db"] = p.target_db
admin_connection_parameters["force"] = p.force_copy

#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if (p.verbose):
	mdb.max_verbosity()

try:
	mdb.connect(**connection_parameters)
	connection_parameters = mdb.connection_information()

	# initiate the copy
	print "Copying or merging '%s' into '%s' on %s ..." % (
		connection_parameters["db"],
		p.target_db,
		connection_parameters["url"]
	)

	mdb.backend.copy_database(**admin_connection_parameters)

except Exception as msg:
	error(msg)

print "Done."
