#!/usr/bin/env python3
"""
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)
