testthat::context("Compare splitLexisDT results with splitLexis results")

testthat::test_that("splitLexisDT and splitLexis are congruent", {
  popEpi:::skip_normally()
  
  library(Epi)
  
  sire2 <- data.table::copy(popEpi::sire)
  sire2[, dg_yrs := get.yrs(dg_date, "actual")]
  sire2[, ex_yrs := get.yrs(ex_date, "actual")]
  sire2[, bi_yrs := get.yrs(bi_date, "actual")]
  sire2[, id := 1:.N]
  
  BL <- list(fot = 0:5, fot = 2:6, fot = c(10,Inf), fot = c(0, Inf),
             per = 1990:1995, per = seq(1950,2010,10), per = c(1900, 2100), 
             age = seq(0,150,5), age = c(25,100), age = c(0, 60))
  
  x <- Lexis(data=sire2[dg_date < ex_date], entry=list(fot=0, per=dg_yrs, age=dg_age),
             exit=list(per=ex_yrs), merge=TRUE, exit.status=1L, entry.status = 0L)
  setDT(x)
  forceLexisDT(x, breaks = list(fot=NULL,per=NULL,age=NULL),
               allScales = c("fot", "per", "age"))
  
  
  # x2 <- splitLexis(x, breaks = BL[[3]], time.scale = "fot")
  # x3 <- splitLexisDT(x, breaks = BL[[3]], timeScale = "fot", drop = FALSE)
  # x2 <- intelliDrop(setDT(x2),  breaks = list(fot = BL[[3]]))
  # x3 <- intelliDrop(x3,  breaks = list(fot = BL[[3]]))
  # x4 <- splitLexisDT(x, breaks = BL[[3]], timeScale = "fot", drop = TRUE)
  
  
  # one row per id ---------------------------------------------------------------
  
  testthat::test_that("splitLexisDT and splitLexis congruent with one row per id", {
    testthat::expect_identical(1L, 1L) ## to trigger testing...
    for (sc in seq_along(BL)) {
      testthat::test_that(paste0("results congruent using breaks ", sc), {
        testthat::expect_identical(1L, 1L) ## to trigger testing...
        popEpi:::compareSLDTWithEpi(data = x, breaks = BL[[sc]], timeScale = names(BL)[sc])
      })
    }
  })
  
  
  
  # multiple rows per id ---------------------------------------------------------
  
  sire2 <- sire2[rep(1:.N, each = 2)]
  
  
  x <- Lexis(data=sire2[dg_date < ex_date], entry=list(fot=0, per=dg_yrs, age=dg_age),
             exit=list(per=ex_yrs), merge=TRUE, exit.status=1L, entry.status = 0L, id = id)
  
  
  testthat::test_that("splitLexisDT and splitLexis congruent with multiple rows per id", {
    testthat::expect_identical(1L, 1L) ## to trigger testing...
    for (sc in seq_along(BL)) {
      testthat::test_that(paste0("results congruent using breaks ", sc), {
        testthat::expect_identical(1L, 1L) ## to trigger testing...
        popEpi:::compareSLDTWithEpi(data = x, breaks = BL[[sc]], timeScale = names(BL)[sc])
      })
    }
  })
  
  
  # multistate using Lexis -----------------------------------------------------
  
  sire2[, "EX" := factor(status, levels = 0:2, ordered = TRUE)]    
  sire2[, "EN" := factor(0L, levels = 0:2, ordered = TRUE)]
  levels(sire2$EX) <- levels(sire2$EN) <- c("ok", "dead", "dead")
  
  x <- Lexis(data = sire2[dg_date < ex_date & !duplicated(id)], 
             entry = list(fot=0, per=bi_yrs, age=0),
             exit = list(per=ex_yrs), 
             merge=TRUE, 
             exit.status=EX, 
             entry.status = EN, 
             id = id)
  
  x <- cutLexis(x, cut = x$dg_yrs, timescale = "per", new.state = "sick", precursor.state = "ok")
  setDT(x)
  setattr(x, "class", c("Lexis", "data.table", "data.frame"))
  
  testthat::test_that("splitLexisDT and splitLexis congruent with multiple Lexis states per id", {
    testthat::expect_identical(1L, 1L) ## to trigger testing...
    for (sc in seq_along(BL)) {
      testthat::test_that(paste0("results congruent using breaks ", sc), {
        testthat::expect_identical(1L, 1L) ## to trigger testing...
        popEpi:::compareSLDTWithEpi(data = x, breaks = BL[[sc]], timeScale = names(BL)[sc])
      })
    }
  })
  
  # using mstate package -------------------------------------------------------
  if (requireNamespace("mstate")) {
    testthat::test_that("splitLexisDT and splitLexis congruent using mstate data", {
      testthat::expect_identical(1L, 1L) ## to trigger testing...
      ## taken directly from ?msprep examples
      library(mstate)
      tmat <- trans.illdeath()
      # some data in wide format
      tg <- data.frame(stt=rep(0,6),sts=rep(0,6),
                      illt=c(1,1,6,6,8,9),ills=c(1,0,1,1,0,1),
                      dt=c(5,1,9,7,8,12),ds=c(1,1,1,1,1,1),
                      x1=c(1,1,1,2,2,2),x2=c(6:1))
      tg$x1 <- factor(tg$x1,labels=c("male","female"))
      tg$patid <- factor(2:7,levels=1:8,labels=as.character(1:8))
      # define time, status and covariates also as matrices
      tt <- matrix(c(rep(NA,6),tg$illt,tg$dt),6,3)
      st <- matrix(c(rep(NA,6),tg$ills,tg$ds),6,3)
      keepmat <- data.frame(gender=tg$x1,age=tg$x2)
      # data in long format using msprep
      df <- msprep(time=tt,status=st,trans=tmat,keep=as.matrix(keepmat))
      
      x <- Lexis(data=df, entry=list(TT = Tstart), exit=list(TT = Tstop), 
                merge=TRUE, exit.status=to, entry.status = from, id = id)
      setDT(x)
      setattr(x, "class", c("Lexis", "data.table", "data.frame"))
      BL2 <- list(TT = 0:4, TT = 1:2, TT = 0:1, TT = c(1,Inf))
      
      for (sc in seq_along(BL2)) {
        testthat::test_that(paste0("results congruent using breaks ", sc), {
          testthat::expect_identical(1L, 1L) ## to trigger testing...
          popEpi:::compareSLDTWithEpi(data = x, breaks = BL2[[sc]], timeScale = "TT")
        })
      }
    })
  }
  
})




