#!/usr/bin/env coffee

fs = require("fs")
child_process = require("child_process")
serverPublicKey = ""
curvekeysDir = "/data/curvekeys"
keyPaths =
  serverPub: curvekeysDir + "/serverPublic"
  serverPriv: curvekeysDir + "/serverPrivate"
  producerPub: curvekeysDir + "/producerPublic"
  producerPriv: curvekeysDir + "/producerPrivate"
  clientPub: curvekeysDir + "/clientPublic"
  clientPriv: curvekeysDir + "/clientPrivate"

generateKeys = (cb) ->
  stdout = child_process.execSync("curve_keygen")
  out = stdout.toString()
  out = out.replace(/\n/g, "")
  keysArray = out.split("==")
  publicKey = keysArray[2] or ""
  privateKey = keysArray[4] or ""
  cb publicKey, privateKey

createFirstKeys = (cb) ->
  fs.mkdirSync curvekeysDir  unless fs.existsSync(curvekeysDir)
  generateKeys (pub, priv) ->
    fs.writeFileSync keyPaths.serverPub, pub
    fs.writeFileSync keyPaths.serverPriv, priv

  generateKeys (pub, priv) ->
    fs.writeFileSync keyPaths.producerPub, pub
    fs.writeFileSync keyPaths.producerPriv, priv

  generateKeys (pub, priv) ->
    fs.writeFileSync keyPaths.clientPub, pub
    fs.writeFileSync keyPaths.clientPriv, priv

  cb()

readKeys = (cb) ->
  localError = false
  try
    serverPublicKey = fs.readFileSync(keyPaths.serverPub)
    serverPublicKey = serverPublicKey.toString()
    clientPublicKey = fs.readFileSync(keyPaths.clientPub)
    clientPublicKey = clientPublicKey.toString()
    clientPrivateKey = fs.readFileSync(keyPaths.clientPriv)
    clientPrivateKey = clientPrivateKey.toString()
    return cb(serverPublicKey, clientPublicKey, clientPrivateKey)
  catch _error
    e = _error
    return createFirstKeys(->
      readKeys cb
    )
  return

readKeys (serverPublicKey, clientPublicKey, clientPrivateKey) ->
  console.log "server.pub\n" + (JSON.stringify(serverPublicKey))
  console.log "client.pub\n" + (JSON.stringify(clientPublicKey))
  console.log "client.private\n" + (JSON.stringify(clientPrivateKey))

