################################################################################
# TABLE     : t_ae_by_relationship  (Parallel-group)
# TITLE     : Treatment-Related Treatment-Emergent Adverse Events by System
#             Organ Class and Preferred Term
# POPULATION: Safety Population (SAFFL == "Y")
# INPUT     : ADAE (TRTEMFL == "Y" & AREL related)
# NOTE      : PSEUDOCODE. Restricts to treatment-RELATED TEAEs using the house
#             "related" set, case-safe: toupper(AREL) %in%
#             {RELATED, POSSIBLE, PROBABLE, DEFINITE}. Counts = PARTICIPANTS
#             (n_distinct USUBJID), NOT event rows. n (%) per arm; % denominator
#             = SAFFL N per arm. Parallel: column = TRT01A.
################################################################################
source("../00_setup_helpers.R")
env <- setup(study = "CP-101", adam = "/data/adam", out = "/data/tfl")
dv  <- design_vars("PARALLEL")                  # trtvar = TRT01A

denom <- bign(adam$adsl, trtvar = dv$trtvar, popfl = "SAFFL")

## --- house "related" set, applied case-safe --------------------------------
rel_set <- c("RELATED","POSSIBLE","PROBABLE","DEFINITE")

adae <- adam$adae %>%
  filter(SAFFL == "Y", TRTEMFL == "Y", toupper(AREL) %in% rel_set)

## 1) Any related TEAE overall (distinct participants)
any_rel <- adae %>% group_by(trt = .data[[dv$trtvar]]) %>%
  summarise(nsubj = n_distinct(USUBJID), .groups = "drop") %>%
  mutate(AESOC = NA_character_, AEDECOD = NA_character_, level = 0L,
         term = "Participants with any treatment-related TEAE")

## 2) by SOC (distinct related-AE participants within SOC)
soc <- aecount(adae, trtvar = dv$trtvar,
               where = quote(toupper(AREL) %in% c("RELATED","POSSIBLE","PROBABLE","DEFINITE")),
               byvars = "AESOC") %>%
  mutate(level = 1L, term = AESOC)

## 3) by SOC*PT
socpt <- aecount(adae, trtvar = dv$trtvar,
                 where = quote(toupper(AREL) %in% c("RELATED","POSSIBLE","PROBABLE","DEFINITE")),
                 byvars = c("AESOC","AEDECOD")) %>%
  mutate(level = 2L, term = paste0("   ", AEDECOD))

## --- ordering: SOC by overall freq desc; PT within SOC desc ----------------
soc_ord <- soc   %>% group_by(AESOC)          %>% summarise(socn = sum(nsubj), .groups = "drop")
pt_ord  <- socpt %>% group_by(AESOC, AEDECOD) %>% summarise(ptn  = sum(nsubj), .groups = "drop")

## --- assemble: Any -> SOC -> indented PT, n (%) per arm --------------------
rep <- bind_rows(any_rel, soc, socpt) %>%
  left_join(denom, by = "trt") %>%
  mutate(value = n_pct(nsubj, N)) %>%
  left_join(soc_ord, by = "AESOC") %>%
  left_join(pt_ord,  by = c("AESOC","AEDECOD")) %>%
  arrange(desc(socn), AESOC, level, desc(ptn)) %>%
  select(term, level, trt, value) %>%
  pivot_wider(names_from = trt, values_from = value)

ttl <- tfl_titles(
  num  = "14.3.1.3",
  type = "Table",
  text = "Treatment-Related Treatment-Emergent Adverse Events by SOC and Preferred Term",
  pop  = "Safety Population",
  foot = paste("Treatment-related = AREL in {RELATED, POSSIBLE, PROBABLE, DEFINITE}",
               "(case-insensitive). A participant is counted once at each level.",
               "% = participants / N in arm. {meddra}."))

## rtables/gt: SOC bold (level 1), PT indented (level 2)
print(rep)
