#!/usr/bin/env python
'''
  Generate the partitions json file from the $OC* environment variables

  Usage: onos-gen-partitions [output file]
  If output file is not provided, the json is written to stdout.
'''

from os import environ
from collections import deque, OrderedDict
import re
import json
import sys

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_OC_vars():
  vars = []
  for var in environ:
    if re.match(r"OC[0-9]+", var):
      vars.append(var)
  return sorted(vars, key=alphanum_key)

def get_nodes(vars, port=9876):
  node = lambda k: { 'id': k, 'ip': k, 'tcpPort': port }
  return [ node(environ[v]) for v in vars ]

def generate_permutations(nodes, k):
  l = deque(nodes)
  perms = {}
  for i in range(1, len(nodes)+1):
    perms['p%d' % i] = list(l)[:k]
    l.rotate(-1)
  return OrderedDict(sorted(perms.iteritems(), key=lambda (k, v): alphanum_key(k)))

def generate_permutations2(nodes, k):
  l = deque(nodes)
  perms = {}
  for i in range(1, (len(nodes) + 1) / 2 + 1):
    perms['p%d' % i] = list(l)[:k]
    l.rotate(-2)
  return OrderedDict(sorted(perms.iteritems(), key=lambda (k, v): alphanum_key(k)))


if __name__ == '__main__':
  vars = get_OC_vars()
  nodes = get_nodes(vars)
  partitions = generate_permutations2(nodes, 3)
  data = {
           'nodes': nodes,
           'partitions': partitions
         }
  output = json.dumps(data, indent=4)

  if len(sys.argv) == 2:
    filename = sys.argv[1]
    with open(filename, 'w') as f:
      f.write(output)
  else:
    print output
