#' @title  Find consensus pathway motifs from a list of pathways
#'
#' @param subntwl  A list of igraph objects representing input pathways from
#'                 different samples. It is the output from `subNtw()`
#'
#' @param min_mtf_n_nodes  Number of minimum nodes in a motif. Default: 5
#'
#' @inheritParams ovrGMT
#'
#' @return  A list of igraph objects representing consensus pathway motifs
#'
#' @examples
#'
#' fsubntwl = system.file('extdata/conMtf/subntwl.rds', package='MPAC')
#' subntwl = readRDS(fsubntwl)
#'
#' fomic_gns = system.file('extdata/TcgaInp/inp_focal.rds', package='MPAC')
#' omic_gns = rownames(readRDS(fomic_gns))
#'
#' conMtf(subntwl, omic_gns, min_mtf_n_nodes=50)
#'
#' @export
#'
#' @import igraph
#'
conMtf <- function(subntwl, omic_genes=NULL, min_mtf_n_nodes=5) {
    ent <- n_pats <- NULL

    n_subntws <- length(subntwl)
    names(subntwl) <- paste0('samp', seq_len(n_subntws))

    con_ents <- lapply(names(subntwl), function(pat) {
        data.table(pat=pat, ent=V(subntwl[[pat]])$name)
    }) |> rbindlist() |>
    _[, list(n_pats = .N), by=ent] |> _[ n_pats == n_subntws]$ent

    conl <- induced_subgraph(subntwl[[1]], con_ents) |>
        decompose(min.vertices=min_mtf_n_nodes)

    out_conl <- NULL
    if ( is.null(omic_genes) ) {
        out_conl <- conl
    } else {
        out_conl <- Filter(function(grph) {
            length(intersect(V(grph)$name, omic_genes)) > 0
        }, conl)
    }

    return(out_conl)
}