import { spawn } from "bun"

console.log("\n\n----------------------------------")
console.log(`Node Environment: ${process.env.NODE_ENV || "development"}`)
console.log(`Bun Version: ${Bun.version}`)
console.log("----------------------------------\n\n")

const run = async (cmd: string[]) => {
  // Filter gets rid of empty strings because it FREAKS Bun out
  const proc = spawn(cmd.filter(Boolean), { stdout: "inherit", stderr: "inherit" })
  const status = await proc.exited

  const commandText = cmd.join(" ")
  if (status !== 0) {
    throw new Error(`Process "${commandText}" failed with exit code ${status}`)
  } else {
    console.log(`👋 Process ${commandText}(PID ${proc.pid}) exited with code ${status}`)
  }

  return proc
}

// Make sure we cleanup processes on exit
const prepareCleanup = () => {
  const cleanup = async (signal: NodeJS.Signals | "exit") => {
    process.on(signal, () => {
      console.log(`🛑 Received ${signal}, cleaning up...`)
      procs.forEach((proc) => proc.kill("SIGTERM"))
    })
  }

  cleanup("SIGINT")
  cleanup("SIGTERM")
  cleanup("SIGHUP")
  cleanup("exit")
}

let procs: Bun.Subprocess[] = []
try {
  prepareCleanup()
  const isDev = process.env.NODE_ENV !== "production"
  const noElide = isDev ? "--elide-lines=0" : ""

  procs = await Promise.all([run(["bun", "run", noElide, "--filter=@workshop/http", "start"])])
  console.log("✅ All processes completed successfully")
} catch (error) {
  console.error("❌ One or more processes failed:", error)
  process.exit(1)
}
