#!/usr/bin/env python
"""
usage: onos-gen-config [-h] [-s PARTITION_SIZE] [-n NUM_PARTITIONS]
                            [filename] [node_ip [node_ip ...]]

Generate the partitions json file given a list of IPs or from the $OCC*
environment variables.

positional arguments:
  filename              File to write output to. If none is provided, output
                        is written to stdout.
  node_ip               IP Address(es) of the node(s) in the cluster. If no
                        IPs are given, will use the $OC* environment
                        variables. NOTE: these arguments are only processed
                        after the filename argument.

optional arguments:
  -h, --help            show this help message and exit
  -s PARTITION_SIZE, --partition-size PARTITION_SIZE
                        Number of nodes per partition. Note that partition
                        sizes smaller than 3 are not fault tolerant. Defaults
                        to 3.
  -n NUM_PARTITIONS, --num-partitions NUM_PARTITIONS
                        Number of partitions. Defaults to the number of nodes
                        in the cluster.
"""

from os import environ
import argparse
import re
import json

convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]


def get_vars_by_type(type):
    vars = []
    for var in environ:
        if re.match(r"{}[0-9]+".format(type), var):
            vars.append(var)
    return sorted(vars, key=alphanum_key)


def get_vars():
    vars = get_vars_by_type('OCC')
    if len(vars) == 0:
        vars = get_vars_by_type('OC')
    return vars


def get_nodes(ips=None, default_port=5679):
    node = lambda id, ip, port: {'id': id, 'ip': ip, 'port': port}
    result = []
    if not ips:
        ips = [environ[v] for v in get_vars()]
    i = 1
    for ip_string in ips:
        address_tuple = ip_string.split(":")
        if len(address_tuple) == 3:
            id = address_tuple[0]
            ip = address_tuple[1]
            port = int(address_tuple[2])
        else:
            id = 'atomix-{}'.format(i)
            i += 1
            ip = ip_string
            port = default_port
        result.append(node(id, ip, port))
    return result


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description="Generate the partitions json file given a list of IPs or from environment variables.")
    parser.add_argument(
        'node', metavar='node_ip', type=str, nargs='?',
        help='The node for which to generate the configuration')
    parser.add_argument(
        'filename', metavar='filename', type=str, nargs='?',
        help='File to write output to. If none is provided, output is written to stdout.')
    parser.add_argument(
        '--nodes', '-n', metavar='node_ip', type=str, nargs='+',
        help='IP Address(es) of the storage nodes. If no IPs are given, ' +
             'will use the $OCC* or $OC* environment variables. NOTE: these arguments' +
             ' are only processed after the filename argument.')

    args = parser.parse_args()
    node = args.node
    print node
    filename = args.filename
    nodes = get_nodes(args.nodes)

    data = {
        'name': 'onos',
        'node': {
            'id': node,
            'ip': node,
            'port': 9876
        },
        'storage': nodes
    }
    output = json.dumps(data, indent=4)

    if filename:
        with open(filename, 'w') as f:
            f.write(output)
    else:
        print output
