@lazyglobal off.

RunOncePath("/lib/ui").
RunOncePath("/lib/navigation").
RunOncePath("/lib/throttle").
RunOncePath("/lib/stabilize_rocket").
RunOncePath("/lib/launch_rocket").
RunOncePath("/lib/sensors").
RunOncePath("/lib/reentry").

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.
AddStockButtons(rows[0], "rocket").

MakeMenu(
  stk,
  MakeButton(rows[0], "SENS"),
  List(
    List("Pressure", "RO", "-1"),
    List("Temperature", "RO", "-1"),
    List("Acceleration", "RO", "-1"),
    List("Gravity", "RO", "-1"),
    List("Light", "RO", "-1")
  ),
  "Refresh",
  refreshSensors@,
  refreshSensors@
).

MakeMenu(
  stk,
  MakeButton(rows[0], "GRND"),
  List(
    List("Burn Distance", "RO", "-1"),
    List("Stopping Time", "RO", "-1"),
    List("Stopping Distance", "RO", "-1"),
    List("Stopping dV", "RO", "-1")
  ),
  "",
  { parameter options. },
  {
    parameter options.
    set options["Burn Distance"]:TEXT to TargetBurnDistance():TOSTRING.
    set options["Stopping dV"]:TEXT to SHIP:VELOCITY:SURFACE:MAG:TOSTRING.
    set options["Stopping Time"]:TEXT to BurnTime(SHIP:VELOCITY:SURFACE:MAG):TOSTRING.
    set options["Stopping Distance"]:TEXT to StoppingDistance():TOSTRING.
  }
).

MakeMenu(
  stk,
  MakeButton(rows[1], "REENTRY"),
  List(
    List("Retract Antennae", "BOOL", true)
  ),
  "Execute",
  {
    parameter options.
    PerformReentry(options["Retract Antennae"]:PRESSED).
  }
).
  
MakeButton(rows[1], "HOVER", { Hover(). }).
MakeButton(rows[1], "LAND", { Land(). }).

MakeMenu(
  stk,
  MakeButton(rows[2], "LNCH"),
  List(
    List("Target Apoapsis", "SCALAR", "80000"),
    List("Initial Pitch", "SCALAR", "20"),
    List("Pitch Time", "SCALAR", "45"),
    List("Atmo TWR", "SCALAR", "2.0"),
    List("Minimum Pitch", "SCALAR", "5"),
    List("Autostage", "BOOL", true)
  ),
  "Execute",
  {
    parameter options.
    Launch(
      options["Target Apoapsis"]:TEXT:ToNumber(),
      options["Atmo TWR"]:TEXT:ToNumber(),
      options["Minimum Pitch"]:TEXT:ToNumber(),
      options["Initial Pitch"]:TEXT:ToNumber(),
      options["Pitch Time"]:TEXT:ToNumber(),
      options["Autostage"]:PRESSED
    ).
  }
).

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.
  }
).

MakeMenu(
  stk,
  MakeButton(rows[2], "Config"),
  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().
  }
).


iface:show().
wait until false.

function refreshSensors {
  parameter options.
  set options["Pressure"]:TEXT to ReadSensor("PRES"):TOSTRING.
  set options["Temperature"]:TEXT to ReadSensor("TEMP"):TOSTRING.
  set options["Acceleration"]:TEXT to ReadSensor("ACC"):TOSTRING.
  set options["Gravity"]:TEXT to ReadSensor("GRAV"):TOSTRING.
  set options["Light"]:TEXT to ReadSensor("LIGHT"):TOSTRING.
}