///|
/// Build a photographer's ordered event list, never unwrap a polar missing event.
fn schedule(date : @sun.Instant, site : @sun.Observer) -> String {
  let cfg = @sun.solar_config(20.0, [
    @sun.solar_angle(-4.0, "blueEndAM", "blueStartPM").unwrap(),
  ]).unwrap()
  let t = @sun.sun_times_with(date, site, cfg)
  let mut report = "地面摄影时刻表(UTC;观察点高于可见地平线 20 m)\n"
  let state = match t.state {
    Crosses => "正常升落\n"
    AlwaysAbove => "极昼,无日出日落事件\n"
    AlwaysBelow => "极夜,无日出日落事件\n"
  }
  report += "标准日出日落状态:" + state
  for
    item in [
      ("dawn", "晨间蓝调开始 -6°"),
      ("blueEndAM", "晨间蓝调结束 -4°"),
      ("sunrise", "日出"),
      ("goldenHourEnd", "晨间金色时段结束 +6°"),
      ("goldenHour", "傍晚金色时段开始 +6°"),
      ("sunset", "日落"),
      ("blueStartPM", "傍晚蓝调开始 -4°"),
      ("dusk", "傍晚蓝调结束 -6°"),
    ] {
    let rendered = match t.event(item.0) {
      Some(time) => time.to_iso_utc()
      None => "当日未达到这个高度角"
    }
    report += item.1 + ":" + rendered + "\n"
  }
  report +
  "不含天气、云量和建筑遮挡;金色/蓝调时段是高度角约定,不保证照片光照。\n"
}

///|
fn main {
  println("上海 2026-09-14,31.23°N 121.47°E")
  println(
    schedule(
      @sun.utc(2026, 9, 14).unwrap(),
      @sun.observer(31.23, 121.47).unwrap(),
    ),
  )
  println("对照:朗伊尔城夏至")
  println(
    schedule(
      @sun.utc(2026, 6, 21).unwrap(),
      @sun.observer(78.2232, 15.6469).unwrap(),
    ),
  )
}