library(MASS)
library(lavaan)
library(seminr)

set.seed(20260908)
N <- 700

# Dane syntetyczne. Cztery wymiary niższego rzędu odzwierciedlają
# wspólny konstrukt jakości współpracy naukowej.
jakosc <- rnorm(N)
loc <- sapply(c(.82, .76, .88, .72), function(lambda) {
  lambda * jakosc + sqrt(1 - lambda^2) * rnorm(N)
})

utworz_wskazniki <- function(wymiar, ladunki = c(.82, .76, .72)) {
  sapply(ladunki, function(lambda) {
    lambda * wymiar + sqrt(1 - lambda^2) * rnorm(N)
  })
}

x <- do.call(cbind, lapply(seq_len(4), function(j) {
  utworz_wskazniki(loc[, j])
}))
colnames(x) <- paste0("x", seq_len(12))
dane <- as.data.frame(x)
dane$wynik <- 0.55 * jakosc + rnorm(N, sd = sqrt(1 - .55^2))

# CB-SEM: refleksyjno-refleksyjny model czynnika drugiego rzędu.
model_cbsem <- '
  komunikacja =~ x1 + x2 + x3
  koordynacja =~ x4 + x5 + x6
  zaufanie =~ x7 + x8 + x9
  wsparcie =~ x10 + x11 + x12

  jakosc =~ komunikacja + koordynacja + zaufanie + wsparcie
  wynik ~ jakosc
'

fit_cbsem <- sem(
  model_cbsem,
  data = dane,
  estimator = "MLR",
  std.lv = TRUE
)

stopifnot(lavInspect(fit_cbsem, "converged"))
fitMeasures(
  fit_cbsem,
  c(
    "chisq.scaled", "df.scaled", "pvalue.scaled",
    "cfi.scaled", "tli.scaled", "rmsea.scaled",
    "rmsea.ci.lower.scaled", "rmsea.ci.upper.scaled", "srmr"
  )
)
subset(
  parameterEstimates(fit_cbsem, standardized = TRUE, ci = TRUE),
  op == "=~" & lhs == "jakosc",
  select = c(lhs, op, rhs, est, se, pvalue, ci.lower, ci.upper, std.all)
)
subset(
  parameterEstimates(fit_cbsem, standardized = TRUE, ci = TRUE),
  op == "~" & lhs == "wynik",
  select = c(lhs, op, rhs, est, se, pvalue, ci.lower, ci.upper, std.all)
)

# PLS-SEM: wymiary są mierzone refleksyjnie, natomiast ich wyniki
# tworzą kompozyt jakości w podejściu two-stage.
model_pomiarowy <- constructs(
  reflective("Komunikacja", multi_items("x", 1:3)),
  reflective("Koordynacja", multi_items("x", 4:6)),
  reflective("Zaufanie", multi_items("x", 7:9)),
  reflective("Wsparcie", multi_items("x", 10:12)),
  higher_composite(
    "Jakosc",
    dimensions = c("Komunikacja", "Koordynacja", "Zaufanie", "Wsparcie"),
    method = two_stage,
    weights = mode_B
  ),
  composite("Wynik", single_item("wynik"))
)

model_strukturalny <- relationships(
  paths(from = "Jakosc", to = "Wynik")
)

fit_pls <- estimate_pls(
  data = dane,
  measurement_model = model_pomiarowy,
  structural_model = model_strukturalny
)
summary(fit_pls)

# Bootstrap jest kosztowny, dlatego uruchamia się go jawnie.
# W analizie końcowej ustaw przynajmniej kilka tysięcy replikacji.
if (identical(Sys.getenv("RUN_SEMINR_BOOTSTRAP"), "1")) {
  boot_pls <- bootstrap_model(
    seminr_model = fit_pls,
    nboot = 5000,
    cores = max(1L, parallel::detectCores(logical = FALSE) - 1L),
    seed = 20260908
  )
  print(summary(boot_pls))
}

write.csv(dane, "dane_konstrukt_wyzszego_rzedu.csv", row.names = FALSE)
sessionInfo()
