test_that("add notesMaster", {
  doc <- read_pptx()
  doc <- add_slide(doc, "Title and Content", "Office Theme")
  add_notesMaster(doc)

  doc$content_type$save()
  content_type <- read_xml(file.path(doc$package_dir, "[Content_Types].xml"))
  nodeset <- xml_find_all(content_type, "//d1:Override")
  ct_df <- data.frame(
    PartName = xml_attr(nodeset, "PartName"),
    ContentType = xml_attr(nodeset, "ContentType")
  )
  notesMasterFile <- ct_df$PartName[
    ct_df$ContentType ==
      "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml"
  ]
  expect_length(notesMasterFile, 1)
  expect_true(file.exists(file.path(doc$package_dir, notesMasterFile)))
  expect_equal(basename(notesMasterFile), names(doc$notesMaster$names()))

  nslideMaster <- doc$notesMaster$collection_get(basename(notesMasterFile))
  rels <- nslideMaster$rel_df()
  theme_file <- rels$target[
    rels$type ==
      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"
  ]
  expect_length(theme_file, 1)
  expect_true(file.exists(file.path(
    doc$package_dir,
    dirname(notesMasterFile),
    theme_file
  )))
  expect_true(any(grepl(
    basename(theme_file),
    ct_df$PartName[
      ct_df$ContentType ==
        "application/vnd.openxmlformats-officedocument.theme+xml"
    ]
  )))

  xml <- doc$presentation$get()
  node <- xml_find_all(xml, "//p:notesMasterIdLst/p:notesMasterId")
  expect_length(node, 1)
  rid <- xml_attr(node, "id")
  pr_rel <- doc$presentation$rel_df()
  pr_rel <- pr_rel[pr_rel$id == rid, ]
  expect_equal(
    pr_rel$type,
    "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster"
  )
  expect_equal(file.path("/ppt", pr_rel$target), notesMasterFile)
})


test_that("add notesSlide", {
  doc <- read_pptx()
  doc <- add_slide(doc, "Title and Content", "Office Theme")
  get_or_create_notesSlide(doc)

  doc$content_type$save()
  content_type <- read_xml(file.path(doc$package_dir, "[Content_Types].xml"))
  nodeset <- xml_find_all(content_type, "//d1:Override")
  ct_df <- data.frame(
    PartName = xml_attr(nodeset, "PartName"),
    ContentType = xml_attr(nodeset, "ContentType")
  )
  notesSlideFile <- ct_df$PartName[
    ct_df$ContentType ==
      "application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml"
  ]
  expect_length(notesSlideFile, 1)
  expect_true(file.exists(file.path(doc$package_dir, notesSlideFile)))

  current_slide <- doc$slide$get_slide(doc$cursor)
  rel_df <- current_slide$rel_df()
  notes_ref <- rel_df$target[
    rel_df$type ==
      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide"
  ]
  expect_length(notes_ref, 1)
  expect_equal(basename(notes_ref), basename(notesSlideFile))

  idx <- doc$notesSlide$slide_index(basename(notesSlideFile))
  nslide <- doc$notesSlide$get_slide(idx)
  rel_df <- nslide$rel_df()
  master_rel <- rel_df$target[
    rel_df$type ==
      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster"
  ]
  expect_equal(basename(master_rel), names(doc$notesMaster$names()))
  slide_rel <- rel_df$target[
    rel_df$type ==
      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide"
  ]
  expect_equal(basename(slide_rel), current_slide$name())
})

test_that("add notes to notesSlide", {
  doc <- read_pptx()
  doc <- add_slide(doc, "Title and Content", "Office Theme")
  doc <- set_notes(
    doc,
    "I am a test!",
    notes_location_label("Notes Placeholder 4")
  )

  nslide <- doc$notesSlide$get_slide(1)
  xml <- nslide$get()
  xpath_ <- "//p:sp[p:nvSpPr/p:cNvPr/@name='Notes Placeholder 4']"
  node_ <- xml_find_all(xml, xpath_)
  expect_false(inherits(node_, "xml_missing"))
  expect_equal(xml_text(node_), "I am a test!")
})

test_that("add notes to notesSlide", {
  doc <- read_pptx()
  doc <- add_slide(doc, "Title and Content", "Office Theme")
  doc <- set_notes(doc, "I am a test!", notes_location_type("body"))

  nslide <- doc$notesSlide$get_slide(1)
  xml <- nslide$get()
  xpath_ <- "//p:sp[p:nvSpPr/p:nvPr/p:ph/@type='body']"
  node_ <- xml_find_all(xml, xpath_)
  expect_false(inherits(node_, "xml_missing"))
  expect_equal(xml_text(node_), "I am a test!")
})
test_that("add block_list to notesSlide", {
  value <- block_list(
    fpar(ftext("hello world")),
    fpar(
      ftext("hello"),
      " ",
      ftext("world")
    ),
    fpar(
      ftext("blah blah blah")
    )
  )

  doc <- read_pptx()
  doc <- add_slide(doc, "Title and Content", "Office Theme")
  doc <- set_notes(doc, value, notes_location_type("body"))

  nslide <- doc$notesSlide$get_slide(1)
  xml <- nslide$get()
  xpath_ <- "//p:sp[p:nvSpPr/p:nvPr/p:ph/@type='body']/p:txBody/a:p"
  nodes <- xml_find_all(xml, xpath_)
  expect_true(length(nodes) > 0)
  expect_equal(
    xml_text(nodes),
    c("hello world", "hello world", "blah blah blah")
  )
})

test_that("replace notes on notesSlide", {
  doc <- read_pptx()
  doc <- add_slide(doc, "Title and Content", "Office Theme")
  doc <- set_notes(doc, "I am a test!", notes_location_type("body"))
  doc <- set_notes(doc, "I am a new test!", notes_location_type("body"))

  nslide <- doc$notesSlide$get_slide(1)
  xml <- nslide$get()
  xpath_ <- "//p:sp[p:nvSpPr/p:nvPr/p:ph/@type='body']"
  node_ <- xml_find_all(xml, xpath_)
  expect_false(inherits(node_, "xml_missing"))
  expect_equal(xml_text(node_), "I am a new test!")
})
