library(testthat)
library(cgmguru)
library(iglu)

data(example_data_5_subject)

make_pipeline <- function(df) {
	gap <- 15; threshold <- 130; hours <- 2
	grid_result <- grid(df, gap = gap, threshold = threshold)
	mod_grid_result <- mod_grid(df, start_finder(grid_result$grid_vector), hours = hours, gap = gap)
	max_after <- find_max_after_hours(df, start_finder(mod_grid_result$mod_grid_vector), hours = hours)
	local_maxima <- find_local_maxima(df)
	final_maxima <- find_new_maxima(df, max_after$max_index, local_maxima$local_maxima_vector)
	list(grid_result = grid_result, final_maxima = final_maxima)
}

test_that("transform_df returns expected columns and non-empty with typical data", {
	pl <- make_pipeline(example_data_5_subject)
	trans <- transform_df(pl$grid_result$episode_start, pl$final_maxima)
	expect_true(is.data.frame(trans))
	expect_true(all(c("id","grid_time","grid_gl","maxima_time","maxima_gl") %in% names(trans)))
	# grid_time <= maxima_time (0 to 4 hours window) if present
	if (nrow(trans) > 0) {
		dh <- as.numeric(difftime(trans$maxima_time, trans$grid_time, units = "hours"))
		expect_true(all(dh >= 0 | is.na(dh)))
		expect_true(all(dh <= 4 + 1e-9 | is.na(dh)))
	}
})

test_that("detect_between_maxima consumes transform_df and returns expected schema", {
	pl <- make_pipeline(example_data_5_subject)
	trans <- transform_df(pl$grid_result$episode_start, pl$final_maxima)
	res <- detect_between_maxima(example_data_5_subject, trans)
	expect_true(is.list(res) || is.data.frame(res))
	expect_true(all(c("results","episode_counts") %in% names(res)))
	expect_true(is.data.frame(res$results))
	# results columns per implementation
	expect_true(all(c("id","grid_time","grid_gl","maxima_time","maxima_glucose","time_to_peak") %in% names(res$results)))
	# time_to_peak should be >= 0 when not NA
	if (nrow(res$results) > 0) {
		ttp <- res$results$time_to_peak
		expect_true(all(is.na(ttp) | ttp >= 0))
	}
})
