# Copyright (c) 2026 INNOVATIO SAS
# SPDX-License-Identifier: MIT
# Reproduce the synthetic MSC-P-004 significance/effect-size examples.

args <- commandArgs(trailingOnly = TRUE)
csv_path <- if (length(args) >= 1) args[[1]] else "msc-p004-significance-effect-size.csv"
d <- read.csv(csv_path, stringsAsFactors = FALSE)

z95 <- qnorm(0.975)
z90 <- qnorm(0.95)

analyse <- function(row) {
  n_a <- as.integer(row$n_a); y_a <- as.integer(row$conversions_a)
  n_b <- as.integer(row$n_b); y_b <- as.integer(row$conversions_b)
  delta <- as.numeric(row$practical_threshold_pp) / 100
  if (n_a <= 0 || n_b <= 0) stop("n_a and n_b must be strictly positive")
  if (y_a < 0 || y_a > n_a || y_b < 0 || y_b > n_b) stop("invalid conversion count")
  if (delta <= 0) stop("practical_threshold_pp must be strictly positive")

  p_a <- y_a / n_a; p_b <- y_b / n_b; difference <- p_b - p_a
  pooled <- (y_a + y_b) / (n_a + n_b)
  se_null <- sqrt(pooled * (1 - pooled) * (1 / n_a + 1 / n_b))
  se <- sqrt(p_a * (1 - p_a) / n_a + p_b * (1 - p_b) / n_b)
  if (se_null == 0 || se == 0) stop("sampling variance is zero")

  p_value <- 2 * pnorm(-abs(difference / se_null))
  ci95 <- difference + c(-1, 1) * z95 * se
  ci90 <- difference + c(-1, 1) * z90 * se
  tost_p <- max(pnorm(-(difference + delta) / se), pnorm((difference - delta) / se))
  equivalent <- ci90[[1]] > -delta && ci90[[2]] < delta && tost_p < 0.05
  decision <- if (ci95[[1]] > delta) {
    "practically-convincing-benefit"
  } else if (ci95[[2]] < -delta) {
    "practically-convincing-harm"
  } else if (p_value < 0.05 && equivalent) {
    "detectable-but-negligible"
  } else if (equivalent) {
    "practically-equivalent"
  } else {
    "inconclusive"
  }
  lift <- if (p_a == 0) NA_real_ else 100 * difference / p_a
  cat(sprintf(
    "%s: difference=%.6fpp; lift=%.6f%%; p=%.8g; ci95=[%.6f, %.6f]pp; ci90=[%.6f, %.6f]pp; tost_p=%.8g; decision=%s\n",
    row$scenario, 100 * difference, lift, p_value, 100 * ci95[[1]], 100 * ci95[[2]],
    100 * ci90[[1]], 100 * ci90[[2]], tost_p, decision
  ))
}

invisible(lapply(seq_len(nrow(d)), function(i) analyse(d[i, , drop = FALSE])))
