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

import logging

from docopt import docopt
import ConfigParser
import sys, os

from mongoSuite import Node
from mongoSuite import Instance
from mongoSuite import ReplSet
from mongoSuite import Tools

doc = """mongoSuite, 

Usage:
  mongoSuite init                                           [--verbose]
  mongoSuite node     list                                  [--verbose]
  mongoSuite node     status [<node>]                       [--verbose]
  mongoSuite instance list                                  [--verbose]
  mongoSuite instance status [<instance>]                   [--verbose]
  mongoSuite instance [start|stop|restart|reset] <instance> [--verbose]
  mongoSuite replSet  list                                  [--verbose]
  mongoSuite replSet  status [<replSet>]                    [--verbose]
  mongoSuite replSet  [start|stop|restart] <replSet>        [--verbose]
  mongoSuite replSet  init   <replSet>                      [--verbose]
  mongoSuite -h | --help

Options:
  -h --help               Show help
  --verbose               Display debug output
"""
args = docopt(doc)

# Init logging
if args.get('--verbose', False):
	logger_level = logging.DEBUG
else:
	logger_level = logging.INFO

logging.basicConfig(format='%(levelname)s %(name)s: %(message)s')
logger 	= logging.getLogger('mongoSuite')
logger.setLevel(logger_level)

logger.debug("Args: \n%s" % args)

main_config_path_default = '~/mongoSuite/etc/mongoSuite.conf'
main_config_path = os.environ.get('MONGOSUITE_CONF', main_config_path_default)

if main_config_path == '':
	main_config_path = main_config_path_default

main_config_path = os.path.expanduser(main_config_path)

logger.debug("main_config_path: %s" % main_config_path)

# Make configuration directory
try:
	os.mkdir(os.path.dirname(main_config_path))
except:
	pass

# Check main configuration file
if not os.path.exists(main_config_path):
	logger.info("Impossible to find configuration file '%s', I Create it with default options." % main_config_path)
	Tools.create_default_config(main_config_path)
	logger.debug(" + Done")

if args.get('init', False) and not args.get('replSet', False):
	sys.exit(0)

logger.debug("Open configuration file. (%s)" % main_config_path)
main_config = ConfigParser.ConfigParser()
main_config.read(main_config_path)

main_config_sections =  main_config.sections()
main_config_nodes = 	[section.split('-', 1)[1] for section in main_config_sections if section.split('-')[0] == "node"]
main_config_replSets =  [section.split('-', 1)[1] for section in main_config_sections if section.split('-')[0] == "replSet"]
main_config_instances = [section.split('-', 1)[1] for section in main_config_sections if section.split('-')[0] == "instance"]

logger.debug(" + Sections:  %s" % main_config_sections)
logger.debug(" + Nodes:     %s" % main_config_nodes)
logger.debug(" + Instances: %s" % main_config_instances)
logger.debug(" + replSet:   %s" % main_config_replSets)

nodes = {}
replSets = {}
instances = {}

# Nodes
for name in main_config_nodes:
	nodes[name] = Node(main_config=main_config, name=name, logger_level=logger_level)
	nodes[name].connected

# Instances
for name in main_config_instances:
	node_name = main_config.get("instance-%s" % name, "node")
	node = nodes.get(node_name, None)
	if node:
		instances[name] = Instance(main_config=main_config, node=node, name=name, logger_level=logger_level)
	else:
		logger.warning("Node '%s' not found in configuration file, disable instance '%s'" % (node_name, name))

# replSets
for name in main_config_replSets:
	replSets[name] = ReplSet(main_config=main_config, name=name, instances=instances, logger_level=logger_level)

logger.debug("Parse command line parameters:")

name = None
items = {}
item = None

# Get items and item
if args.get('<node>', None):
	items = nodes
	name = args.get('<node>', None)

if args.get('<instance>', None):
	items = instances
	name = args.get('<instance>', None)

if args.get('<replSet>', None):
	items = replSets
	name = args.get('<replSet>', None)

if not items:
	if args.get('node', None):
		items = nodes
	if args.get('instance', None):
		items = instances
	if args.get('replSet', None):
		items = replSets

# Sort keys
item_keys = items.keys()
item_keys.sort()

if name == "all":
	name = None

logger.debug("Name: %s" % name)

if name:
	item = items.get(name, None)
	if not item:
		logger.error("'%s' not found" % name)
		sys.exit(1)

if item:
	items = {}
	items[item.name] = item

logger.debug("Item:  %s" % item)
logger.debug("Items: %s" % items)

if args.get('list', False):
	for name in item_keys:
		print (" + %s" % name)

if args.get('status', False):
	for name in item_keys:
		items[name].status()
		print("")

if args.get('start', False):
	for name in item_keys:
		items[name].start()

if args.get('stop', False):
	for name in item_keys:
		items[name].stop()

if args.get('reset', False):
	for name in item_keys:
		items[name].stop()
		items[name].reset()

if args.get('restart', False):
	for name in item_keys:
		items[name].stop()
		items[name].start()

if args.get('init', False):
	item.init()