library(tidyverse)

## necessary only during gargle development to get devtools' shim for
## system.file()
load_all()
ddi_dir <- system.file("discovery-doc-ingest", package = "gargle")

source(fs::path(ddi_dir, "ingest-functions.R"))

x <- download_discovery_document("discovery:v1")
ee <- read_discovery_document(x)

# api-wide parameters
ap <- ee |>
  pluck("parameters") |>
  enframe(name = "property", value = "info") |>
  mutate(info = map(info, enframe)) |>
  unnest(cols = info) |>
  spread(key = name, value = value, convert = TRUE) |>
  select(property, type, description, everything()) |>
  write_csv(fs::path(ddi_dir, "api-wide-parameters.csv"))

# properties of a method
mp <- ee |>
  pluck("schemas", "RestMethod", "properties") |>
  enframe(name = "property", value = "info") |>
  mutate(info = map(info, enframe)) |>
  unnest(cols = info) |>
  spread(key = name, value = value, convert = TRUE) |>
  select(property, type, description, everything()) |>
  write_csv(fs::path(ddi_dir, "method-properties.csv"))

# properties of a parameter of a method
pp <- ee |>
  pluck("schemas", "JsonSchema", "properties") |>
  enframe(name = "property", value = "info") |>
  mutate(info = map(info, enframe)) |>
  unnest(cols = info) |>
  spread(key = name, value = value, convert = TRUE) |>
  select(property, type, description, everything()) |>
  write_csv(fs::path(ddi_dir, "parameter-properties.csv"))

make_humane_table <- function(df) {
  pad <- function(.x, .n) {
    length(.x) <- .n
    .x
  }
  df |>
    select(property, type, description) |>
    mutate(
      description = str_wrap(description, width = 45),
      description = str_split(description, pattern = "\n"),
      n = lengths(description),
      property = map2(property, n, pad),
      type = map2(type, n, pad),
      n = NULL
    ) |>
    unnest(cols = c(property, type, description)) |>
    replace_na(list(property = "", type = "")) |>
    modify_at(c("property", "type"), ~ format(.x, justify = "left")) |>
    glue::glue_data("{property} {type} {description}")
}

make_humane_table(ap) |>
  write_lines(fs::path(ddi_dir, "api-wide-parameters-humane.txt"))

make_humane_table(mp) |>
  write_lines(fs::path(ddi_dir, "method-properties-humane.txt"))

make_humane_table(pp) |>
  write_lines(fs::path(ddi_dir, "parameter-properties-humane.txt"))

write_lines(mp$property, fs::path(ddi_dir, "api-wide-parameter-names.txt"))

write_lines(mp$property, fs::path(ddi_dir, "method-property-names.txt"))

write_lines(pp$property, fs::path(ddi_dir, "parameter-property-names.txt"))
