@lazyglobal off.

runoncepath("/lib/ui").
runoncepath("/lib/navigation").
runoncepath("/lib/throttle").
runoncepath("/lib/node").
runoncepath("/lib/stabilize_rocket").
runoncepath("/lib/launch_rocket").

clearguis().

global done is false.
on AG9 {
  set done to true.
  return true.
}

// Top-level menu structure.
local iface is gui(250, 300).
set iface:X to 200.
set iface:Y to 700.
local top is iface:AddVLayout().
local rows is list(MakeRow(top), MakeRow(top), MakeRow(top)).
local stk is iface:AddStack().

// Buttons and menus.
local btn is rows[0]:AddButton("TERM").
set btn:TOGGLE to true.
set btn:ONTOGGLE to {
  parameter d.

  if d {
    CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal").
  } else {
    CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Close Terminal").
  }
}.

MakeMenu(
  stk,
  MakeButton(rows[0], "CONF"),
  List(
    List("Torque Epsilon Max", "SCALAR", "0.001"),
    List("Max Stopping Time", "SCALAR", "2.0")
  ),
  "Apply",
  {
    parameter options.
    set STEERINGMANAGER:TORQUEEPSILONMAX to options["Torque Epsilon Max"]:TEXT:ToNumber().
    set STEERINGMANAGER:MAXSTOPPINGTIME to options["Max Stopping Time"]:TEXT:ToNumber().
  }
).

MakeButton(rows[1], "ZERO", { ZeroVelocity(). }).
MakeButton(rows[1], "HOVER", { Hover(). }).
MakeButton(rows[1], "LAND", { Land(). }).

MakeMenu(
  stk,
  MakeButton(rows[2], "LNCH"),
  List(
    List("Target Apoapsis", "SCALAR", "80000"),
    List("Atmo TWR", "SCALAR", "1.8"),
    List("Initial Pitch", "SCALAR", "85"),
    List("Minimum Pitch", "SCALAR", "5"),
    List("Gravity Turn Alt", "SCALAR", "8000"),
    List("Gravity Turn Pitch", "SCALAR", "75")
  ),
  "Execute",
  {
    parameter options.
    Launch(
      options["Target Apoapsis"]:TEXT:ToNumber(),
      options["Atmo TWR"]:TEXT:ToNumber(),
      options["Gravity Turn Alt"]:TEXT:ToNumber(),
      options["Gravity Turn Pitch"]:TEXT:ToNumber(),
      options["Initial Pitch"]:TEXT:ToNumber(),
      options["Minimum Pitch"]:TEXT:ToNumber()
    ).
  }
).

MakeMenu(
  stk,
  MakeButton(rows[2], "NODE"),
  List(
    List("Node dV", "RO", "0"),
    List("Node Burn Time", "RO", "0")
  ),
  "Execute",
  {
    parameter options.
    ExecNode().
  },
  {
    parameter options.
    if HASNODE {
      set options["Node dV"]:TEXT to NEXTNODE:DELTAV:MAG:ToString.
      set options["Node Burn Time"]:TEXT to BurnTime(NEXTNODE:DELTAV:MAG):ToString.
    } else {
      set options["Node dV"]:TEXT to "No Node".
      set options["Node Burn Time"]:TEXT to "No Node".
    }
  }
).

MakeMenu(
  stk,
  MakeButton(rows[2], "TWR"),
  List(
    List("Target TWR", "SCALAR", "1.6")
  ),
  "Lock TWR",
  {
    parameter options.
    local done is false.
    print "Locking throttle to target TWR.".
    local tgt is options["Target TWR"]:TEXT:ToNumber().
    lock THROTTLE to ThrottleToTWR(tgt).
    wait until done.
    print "Throttle unlocked.".
    set done to false.
  }
).

iface:show().
wait until false.