#' @importFrom officer fp_cell fp_par fp_text fp_border
complex_tabpart <- function(
  data,
  col_keys = names(data),
  default_pr_text = fp_text(
    font.family = flextable_global$defaults$font.family,
    cs.family = flextable_global$defaults$cs.family,
    eastasia.family = flextable_global$defaults$eastasia.family,
    hansi.family = flextable_global$defaults$hansi.family,
    font.size = flextable_global$defaults$font.size,
    color = flextable_global$defaults$font.color
  ),
  default_pr_par = fp_par(
    text.align = flextable_global$defaults$text.align,
    padding.left = flextable_global$defaults$padding.left,
    padding.right = flextable_global$defaults$padding.right,
    padding.bottom = flextable_global$defaults$padding.bottom,
    padding.top = flextable_global$defaults$padding.top,
    line_spacing = flextable_global$defaults$line_spacing
  ),
  default_pr_cell = fp_cell(
    background.color = flextable_global$defaults$background.color,
    border = fp_border(color = "transparent", width = 0)
  ),
  cwidth = NULL,
  cheight = NULL
) {
  pr_cell_init <- as_struct(nrow(data), col_keys, default_pr_cell, cell_struct)
  pr_par_init <- as_struct(nrow(data), col_keys, default_pr_par, par_struct)
  pr_text_init <- as_struct(nrow(data), col_keys, default_pr_text, text_struct)

  content <- new_chunkset_struct(col_keys = col_keys, data = data)

  span_init <- matrix(1L, nrow = nrow(data), ncol = length(col_keys))
  spans <- list(rows = span_init, columns = span_init)

  if (length(cwidth) == length(col_keys)) {
    colwidths <- cwidth
  } else {
    colwidths <- rep(cwidth, length(col_keys))
  }

  rowheights <- rep(cheight, nrow(data))

  out <- list(
    dataset = data,
    content = content,
    col_keys = col_keys,
    colwidths = colwidths,
    rowheights = rowheights,
    hrule = rep("auto", nrow(data)),
    spans = spans,
    styles = list(
      cells = pr_cell_init,
      pars = pr_par_init,
      text = pr_text_init
    )
  )
  class(out) <- "complex_tabpart"
  out
}
