# create testing example
svg(tempfile("tmp.svg"))

font <- 2:3
format <- matrix(c("", "i", "b", "ib"), nrow = 4, ncol = 2, byrow = FALSE)
size <- matrix(9:9, nrow = 4, ncol = 2, byrow = FALSE)
indent_first <- matrix(c(0, 80), nrow = 4, ncol = 2, byrow = FALSE)
indent_left <- matrix(c(0, 300), nrow = 4, ncol = 2, byrow = FALSE)

tbl1 <- matrix("RStudio is an integrated development environment for R, a programming language for statistical computing and graphics.", nrow = 2, ncol = 2)
tbl2 <- matrix("RStudio", nrow = 2, ncol = 2)
tbl <- rbind(tbl1, tbl2)

tbl <- data.frame(tbl) |>
  rtf_page(orientation = "portrait") |>
  rtf_title(title = c(
    "title here",
    "title 2 here",
    "here is a very very very very very long title 3 that should be broken to two lines if calculated correctly"
  )) |>
  rtf_subline(text = c(
    "subline 1",
    "this is a very long subline that should be broken to 2 lines if calculated correctly by rtf_nrow function"
  )) |>
  rtf_colheader(
    colheader = "a long column 1 header to test line break|col2",
    col_rel_width = c(1, 5)
  ) |>
  rtf_footnote(footnote = c(
    "footer1",
    "this is a very very very very very very very long footer2 that should be broken to 2 lines if calculated correctly by rtf_nrow function"
  )) |>
  rtf_source(source = c("source here", "source 2")) |>
  rtf_body(
    text_justification = "l",
    col_rel_width = c(1, 5),
    text_font = font,
    text_font_size = size,
    text_format = format,
    text_indent_first = indent_first,
    text_indent_left = indent_left
  )
# tbl |> rtf_encode() |> write_rtf("tmp.rtf")


# rtf_nrow
tbl1 <- rtf_nrow(tbl)
bodys <- attr(tbl1, "rtf_nrow")
titles <- attr(tbl1, "rtf_nrow_meta")$title
sublines <- attr(tbl1, "rtf_nrow_meta")$subline
headers <- attr(tbl1, "rtf_nrow_meta")$col_header
footers <- attr(tbl1, "rtf_nrow_meta")$footnote
sources <- attr(tbl1, "rtf_nrow_meta")$source


# nrow_paragraph
nrowpara_title <- nrow_paragraph(attr(tbl, "rtf_title"), size = 6.25, padding = 0)
nrowpara_subline <- nrow_paragraph(attr(tbl, "rtf_subline"), size = 6.25, padding = 0)
nrowpara_footer <- nrow_paragraph(attr(tbl, "rtf_footnote"), size = 6.25, padding = 0)
nrowpara_source <- nrow_paragraph(attr(tbl, "rtf_source"), size = 6.25, padding = 0)


# nrow_table
nrowtable <- nrow_table(tbl, size = 6.25)
nrowtablefooter <- nrow_table(attr(tbl, "rtf_footnote"), size = 6.25)
nrowtablesource <- nrow_table(attr(tbl, "rtf_source"), size = 6.25)


# rnow_table cell size calculation
pad <- (attr(tbl, "text_indent_left") + attr(tbl, "text_indent_right")) / 1440 + 0.2
rel_width <- attr(tbl, "col_rel_width")
width <- 6.25 * rel_width / sum(rel_width)
cellsize <- matrix(width, nrow = nrow(tbl), ncol = ncol(tbl), byrow = TRUE) - pad


# rtf_nline_vector example
nline_vector <- rtf_nline_vector(
  text = c("title 1", "this is a sentence for title 2", NA),
  strwidth = c(
    strwidth("title 1", units = "inches"),
    strwidth("this is a sentence for title 2", units = "inches")
  ),
  size = 0.5
)


# rtf_nline_matrix example
mtx <- matrix("this is a sentence for title 2", nrow = 2, ncol = 2)
mtxstrwidth <- matrix(2, nrow = 2, ncol = 2)
mtxsize <- matrix(5:8 / 10, nrow = 2)
nline_matrix <- rtf_nline_matrix(text = mtx, strwidth = mtxstrwidth, size = mtxsize)


# pageby example

iris[1:2, 1] <- "a long string to test line breaks"

irs <- iris[1:55, ] |>
  rtf_title(title = "pageby example") |>
  rtf_body(page_by = "Species", new_page = TRUE)
# irs |> rtf_encode() |> write_rtf("tmp.rtf")

irs1 <- rtf_nrow(irs)
irsbodys <- attr(irs1, "rtf_nrow")
irspagebybodys <- attr(attr(irs1, "rtf_pageby_table"), "rtf_nrow")
irspagebyrows <- attr(attr(irs1, "rtf_pageby_row")$Species, "rtf_nrow")



test_that("test if rtf_nline_vector() return to correct numbers", {
  # line for first vector
  expect_equal(nline_vector[1], 1)

  # lines for second vector
  expect_equal(nline_vector[2], 6)
})

test_that("test if rtf_nline_matrix() return to correct numbers", {
  # maximum lines for first row
  expect_equal(nline_matrix[1], 6)

  # maximum lines for second row
  expect_equal(nline_matrix[2], 5)
})


test_that("test if nrow_paragraph() return to correct number of titles when there are 3 title lines", {
  # title lines through rtf_nrow
  expect_equal(titles, 4)

  # subline lines through nrow_paragraph
  expect_equal(sum(nrowpara_title), 4)
})


test_that("test if nrow_paragraph() return to correct number of sublines", {
  # subline lines through rtf_nrow
  expect_equal(sublines, 3)

  # subline lines through nrow_paragraph
  expect_equal(sum(nrowpara_subline), 3)
})


test_that("test for nrow_table() when as_table attr is FALSE", {
  expect_equal(sum(nrowpara_source), sources)
})


test_that("test for nrow_table() when as_table attr is TRUE", {
  expect_equal(sum(nrowtablefooter), footers)
})


test_that("test for nrow_table() if actual column size are calculated correctly", {
  # first cell size calculated within nrow_table
  expect_equal(round(cellsize[1, 1], 5), round(6.25 * 1 / 6 - 0.2, 5))

  if (interactive()) {
    # first cell returned lines through nrow_table
    expect_true(nrowtable[1] >= 10)

    # first cell returned lines through rtf_nrow
    expect_true(bodys[1] >= 10)
  }
})


test_that("test for rtf-nrow() if 'rtf-nrow' attributes are added correctly for pageby table", {
  expect_equal(irspagebybodys[1], 2)
})


test_that("test for rtf-nrow() if 'rtf-nrow' attributes are added correctly for pageby_row table", {
  expect_equal(irspagebyrows[1], 1)
})

dev.off()
