///|
fn pcap_baseline_action_clock(
  scenario : String,
  parsed : RtClockCliArgs,
) -> RtClockPlan {
  if scenario == "io-write-highres" && parsed.clock_explicit == false {
    rt_clock_highres(period_us=parsed.clock.period_us)
  } else {
    parsed.clock
  }
}

///|
fn is_pcap_baseline_scenario(scenario : String) -> Bool {
  scenario == "dcp-identify" ||
  scenario == "snmp" ||
  scenario == "lldp" ||
  scenario == "ar-connect" ||
  scenario == "ar-release" ||
  scenario == "record-read" ||
  scenario == "io-cyclic" ||
  scenario == "io-write-highres" ||
  scenario == "alarm"
}

///|
fn run_pcap_baseline(args : Array[String]) -> Unit {
  let parsed = match parse_rt_clock_cli_args(args) {
    Some(value) => value
    None => return
  }
  let args = parsed.args
  guard args.length() >= 4 && args[0] == "--iface" else {
    println(
      "pcap-baseline --iface    [timeout-ms] [device-ip] [station-name] [cycle-count] [--clock highres|monotonic-ms|receive-paced(deprecated)] [--period-us ] [--rt-period-us ] [--data-hold-factor <3..0x1E00>] [--data-hold-ms ] [--rt-output-vlan-pcp <0..7>|--rt-output-vlan-tci <0..0xFFFF>] [--win-rt ...]",
    )
    println(
      "  Scenarios: dcp-identify, ar-release, record-read, io-cyclic, io-write-highres, snmp, lldp, alarm",
    )
    return
  }
  let interface_name = args[1]
  let scenario = args[2]
  if is_pcap_baseline_scenario(scenario) == false {
    println("Invalid scenario: " + scenario)
    println(
      "Scenarios: dcp-identify, ar-release, record-read, io-cyclic, io-write-highres, snmp, lldp, alarm",
    )
    return
  }
  let path = args[3]
  let timeout_ms = match parse_timeout_arg(args, 4, 5000) {
    Some(value) => value
    None => return
  }
  let device_ip = if args.length() >= 6 {
    @frame.IPv4Address::from_text(args[5][:]) catch {
      err => {
        println("Invalid device IP: \{to_repr(err)}")
        return
      }
    }
  } else {
    @frame.IPv4Address::from_text("192.168.3.10") catch {
      err => {
        println("Invalid default device IP: \{to_repr(err)}")
        return
      }
    }
  }
  let station_name = if args.length() >= 7 { args[6] } else { "controller" }
  let cycle_count = if args.length() >= 8 {
    match parse_number_arg(args[7], "cycle count") {
      Some(value) => value
      None => return
    }
  } else if scenario == "io-cyclic" ||
    scenario == "io-write-highres" ||
    scenario == "alarm" {
    10000
  } else {
    0
  }
  let clock = pcap_baseline_action_clock(scenario, parsed)
  let iocr_period = iocr_period_for_clock(clock, parsed.iocr_period)
  emit_windows_realtime_plan(parsed.windows_realtime)
  let fields : Array[String] = [
    "interface=" + interface_name,
    "pcap_scenario=" + scenario,
    "pcap_path=" + path,
    "timeout_ms=" + timeout_ms.to_string(),
    "device_ip=" + device_ip.to_text(),
    "station_name=" + station_name,
    "cycle_count=" + cycle_count.to_string(),
    "required_artifact=lockwire_native_pcap_writer",
    "pcap_writer_owner=lockwire",
    "pcap_written=false",
  ]
  append_rt_plan_fields(
    fields,
    clock,
    iocr_period,
    parsed.data_hold,
    parsed.output_vlan,
    parsed.windows_realtime,
  )
  println(
    provider_harness_rt_pcap_handoff_text(
      "pcap-baseline", "recording artifact", "@rawnet.RawSocket::open + @pcapdump.PcapWriter",
      fields,
    ),
  )
}