// Package for taking a mapping of words to keys and outputing a
// combo engine commpatible def

package main

import (
	"io/ioutil"
	"fmt"
	"encoding/json"
	"os"
	"sort"
	"strings"
	"hash/crc64"
	//"encoding/base64"
)

func main() {
	// Show Usage
	if len(os.Args) < 3 {
		fmt.Println("Usage: ./keymap-gen inputfile outfile")
		fmt.Println("Outputs dict in current dir")
		return
	}

	// Read the source
	data, err := ioutil.ReadFile(os.Args[1])
	if err != nil {
		panic(err)
	}

	// Unbundle Data
	var FullDict map[string]string
	var output   []string
	json.Unmarshal(data, &FullDict)

	// Loop over entries and store
	for i,v := range FullDict {
		// This checks for colllisions, Generates hash
		hash := crc64.Checksum([]byte(v), crc64.MakeTable(crc64.ECMA))
		hashStr := fmt.Sprintf("txt_%x", hash)[:10]

		// Format keys into combo
		var keys string
		for _, k := range(v) {
			keys += fmt.Sprintf("KC_%v, ", string(k))

		}
		keys = keys[:len(keys)-2]

		// Append to output
		spacer := strings.Repeat(" ", 15-len(i))
		output = append(output, fmt.Sprintf("SUBS(%v, %v\"%v\", %v)\n", hashStr, spacer, i, keys))
	}


	sort.Slice(output, func (i,j int) bool {
		return strings.Count(output[i], " ") > strings.Count(output[j], " ")
	})
	ioutil.WriteFile(os.Args[2], []byte(strings.Join(output, "")), 0555)
}