
embryo_col <- 
tc_embryo_data <- function(dt, embryo_col){# Ensure data is a data.table - more efficient than class() check
  if (!data.table::is.data.table(dt)) {
    data.table::setDT(dt)  # Convert to data.table if not already
  }
  
  # Filter selected rows efficiently using data.table syntax
  if (!is.null(rows_selected)) {
    dt <- dt[rows_selected]  # No need for comma in data.table syntax
  }
  
  # Handle single plant case (replicate rows more efficiently)
  if (number_per_tube == 'single plant' && number_of_copies > 0) {
    # Use rep with seq_len instead of 1:nrow for better performance
    indices <- rep(seq_len(nrow(dt)), each = number_of_copies)
    dt <- dt[indices]
    data.table::setorder(dt, 1)  # Order the rows by the first column
  }
  # Handle plants/test tube cases more efficiently with data.table
  else if (number_per_tube %in% c("3 plants/test tube", "6 plants/test tube")) {
    plants_per_tube <- ifelse(number_per_tube == "3 plants/test tube", 3, 6)
    
    # Calculate n directly and more efficiently
    dt[, n := pmin(ceiling(get(embryo_col) / plants_per_tube), get(embryo_col))]
    
    # Replicate rows based on 'n' using data.table
    indices <- rep(seq_len(nrow(dt)), times = dt$n)
    dt <- dt[indices]
    dt[, n := NULL]  # Clean up temporary column
  }
  # Handle Equal to # of embryo_col case
  else if (number_per_tube == "Equal to # of embryo_col") {
    # More efficient replication with vectorized operations
    indices <- rep(seq_len(nrow(dt)), times = dt[[embryo_col]])
    dt <- dt[indices]
  }
  
  if(input$dataset == "embryo_rescue"){
    # Extract prefix and suffix in a vectorized manner
    split_parts <- data.table::tstrsplit(dt$Crossnumber, "_", fixed = TRUE)
    dt[, Prefix := split_parts[[1]]]
    dt[, Suffix := gsub("[()]", "", split_parts[[2]])]
    
    # Return only necessary columns
    result <- dt[, list(Crossnumber, Prefix, Suffix)]
  } else {
    # Split PlantletID into components using data.table's tstrsplit (much faster)
    split_result <- data.table::tstrsplit(dt$PlantletID, "_", fixed = TRUE)
    dt[, c("Prefix", "Suffix", "EmbryoNo") := list(split_result[[1]], 
                                                   gsub("\\(|\\)", "", split_result[[2]]), 
                                                   split_result[[3]])]
    
    # Return only the needed columns (more efficient than creating a new data frame)
    result <- dt[, .(PlantletID, Prefix, Suffix, EmbryoNo)]
  }
}