#!/usr/bin/env node
const path = require("path")
const fs = require("fs")

function processStringSync(string, env) {
  let output = ""

  // process if statements
  let removal = false
  for (let line of string.split("\n")) {
    if (new RegExp(`{{\/if}}`, "g").test(line)) { 
      removal = false
      continue
    } 

    if (!removal) {
      const match = line.match(new RegExp(`{{#if (.*)}}`))
      if (match) {
        const key = match[1]
        // check the if statement is true
        if (!env[key]) {
          removal = true
        }
        continue
      }
      output += line + "\n"
    }
  }

  for (let key in env) {
    // replace variables
    const rgx = new RegExp(`{{\\s*${key}\\s*}}`, "g")
    output = output.replace(rgx, env[key])
  }

  return output
}

const Configs = {
  prod: {
    apps: "app-service.budibase.svc.cluster.local",
    worker: "worker-service.budibase.svc.cluster.local",
    minio: "minio-service.budibase.svc.cluster.local",
    couchdb: "budibase-prod-svc-couchdb",
    resolver: "kube-dns.kube-system.svc.cluster.local"
  },
  preprod: {
    apps: "app-service.budibase.svc.cluster.local",
    worker: "worker-service.budibase.svc.cluster.local",
    minio: "minio-service.budibase.svc.cluster.local",
    couchdb: "budibase-preprod-svc-couchdb",
    resolver: "kube-dns.kube-system.svc.cluster.local"
  },
  release: {
    apps: "app-service.budibase.svc.cluster.local",
    worker: "worker-service.budibase.svc.cluster.local",
    minio: "minio-service.budibase.svc.cluster.local",
    couchdb: "budibase-release-svc-couchdb",
    resolver: "kube-dns.kube-system.svc.cluster.local"
  },
  compose: {
    apps: "app-service",
    worker: "worker-service",
    minio: "minio-service",
    couchdb: "couchdb-service",
    watchtower: "watchtower-service",
    resolver: "127.0.0.11"
  },
}

const Commands = {
  Prod: "prod",
  Preprod: "preprod",
  Release: "release",
  Compose: "compose",
}

async function init(managementCommand) {
  const config = Configs[managementCommand]
  const hostingPath = path.join(process.cwd(), "hosting")
  const nginxHbsPath = path.join(hostingPath, "nginx.prod.conf.hbs")
  const nginxOutputPath = path.join(
    hostingPath,
    "proxy",
    ".generated-nginx.prod.conf"
  )
  const contents = fs.readFileSync(nginxHbsPath, "utf8")
  fs.writeFileSync(nginxOutputPath, processStringSync(contents, config))
}

const managementCommand = process.argv.slice(2)[0]

if (
  !managementCommand ||
  !Object.values(Commands).some(command => managementCommand === command)
) {
  throw new Error(
    "You must supply either a 'compose', 'preprod' or 'prod' commmand to generate an NGINX config."
  )
}

init(managementCommand)
  .then(() => {
    console.log("Done! 🎉")
  })
  .catch(err => {
    console.error(
      "Something went wrong while creating the nginx configuration",
      err.message
    )
  })