#!/usr/bin/env python

import json
import time
import sys
import os
from collections import OrderedDict as dict

content = u"""\n
type cmdConf struct {
    name     string
    argDesc  string
    group    string
    readonly bool
}
"""


def json_to_js(json_path, js_path):
    """Convert `commands.json` to `commands.js`"""
    keys = []
    with open(json_path) as fp:
        _json = json.load(fp)
        for k in _json.keys():
            keys.append(k.encode('utf-8'))
    with open(js_path, "w") as fp:
        generate_time(fp)
        fp.write("module.exports = [\n")
        for k in sorted(keys):
            fp.write('\t"%s",\n' % k.lower())
        fp.write("]")


def json_to_go_array(json_path, go_path):
    g_fp = open(go_path, "w")
    with open(json_path) as fp:
        _json = json.load(fp)
        generate_time(g_fp)
        g_fp.write("package main\n\nvar helpCommands = [][]string{\n")
        _json_sorted = dict(sorted(_json.items(), key=lambda x: x[0]))
        for k, v in _json_sorted.iteritems():
            g_fp.write('\t{"%s", "%s", "%s"},\n' % (k, v["arguments"], v["group"]))
        g_fp.write("}\n")
    g_fp.close()


def json_to_command_cnf(json_path, go_path):
    g_fp = open(go_path, "w")

    with open(json_path) as fp:
        _json = json.load(fp)
        generate_time(g_fp)
        g_fp.write("package server")
        print >> g_fp, content
        g_fp.write("var cnfCmds = []cmdConf{\n")
        for k, v in _json.iteritems():
            g_fp.write('\t{\n\t\t"%s",\n\t\t"%s",\n\t\t"%s", \n\t\t%s,\n\t},\n' %
            (k, v["arguments"], v["group"], "true" if v["readonly"] else "false" ))
        g_fp.write("}\n")
    g_fp.close()


def generate_time(fp):
    fp.write("//This file was generated by ./generate.py on %s \n" %
             time.strftime('%a %b %d %Y %H:%M:%S %z'))


if __name__ == "__main__":
    usage = """
    Usage: python %s src_path dst_path"

    1. for Node.js client:

        python generate.py /path/to/commands.json /path/to/commands.js

    2. for cmd/ledis_cli/const.go
        
        python generate.py /path/to/commands.json /path/to/const.go

    3. for server/command_cnf.go

        python generate.py /path/to/commands.json /path/to/command_cnf.go

    """

    if len(sys.argv) != 3:
        sys.exit(usage % os.path.basename(sys.argv[0]))

    src_path, dst_path = sys.argv[1:]
    dst_path_base = os.path.basename(dst_path)

    if dst_path_base.endswith(".js"):
        json_to_js(src_path, dst_path)

    elif dst_path_base.startswith("const.go"):
        json_to_go_array(src_path, dst_path)

    elif dst_path_base.startswith("command"):
        json_to_command_cnf(src_path, dst_path)

    else:
        print "Not support arguments"
