LttCmpRsk <- function(margins=c("weibull", "weibull"), 
                      para.list=NULL,
                      dependence=NULL,
                      para.marg1=c(1,1), para.marg2=c(1,1), ...){
  stopifnot(length(margins) > 1)
  if(!is.null(para.list)){
    if(length(para.list)==length(margins)){
      para.name.list <- lapply(para.list, names)
      para.np <- sapply(para.list, length)
    } 
    if(length(para.list) > length(margins)){
      print("Choose the vectors with the same length with margins!")
      para.list <- para.list[1:length(margins)]
    }
    if(length(para.list) < length(margins)){
      nd <- length(margins)-length(para.list)
      s <- 0
      while(length(para.list) < length(margins)){
        para.list[length(para.list) + (1:length(para.list))] <- para.list
      }
      para.list <- para.list[1:length(margins)]
    }
  } else{
    argg <- c(as.list(environment()),list(...))
    para.marg <- grep("para.marg", names(argg), value=TRUE)
    
    if(length(para.marg)==0L){
      stop("Need para.list or para.marg1, para.marg2, ...")
    }
    if(length(para.marg) < length(margins)){
      stop("Marginal parameter vectors does not match margins!")
    }
    if(length(para.marg) > length(margins)){
      print("Choose the vectors with the same length with margins!")
      para.marg <- para.marg[1:length(margins)]
    }
    para.list <- argg[para.marg]
  }
  margs.para.list <- CheckParaList(margins=margins, para.list=para.list)
  
  if(is.null(dependence)){
    dependence <- rvinecopulib::bicop_dist(family="indep")
    Indep <- TRUE
  } else{
    Indep <- FALSE
  }
  npv <- sapply(margs.para.list, length)
  np <- sum(npv)
  parav <- unlist(margs.para.list)
  y <- list(margins=margins, margs.para.list=margs.para.list,
            dependence=dependence, Indep=Indep, 
            npv=npv, np=np, parav=parav)
  class(y) <- "LttCmpRsk"
  invisible(y)
}

# Gamma is not applicable
CheckParaList <- function(margins=c("weibull", "weibull"), para.list=NULL){
  stopifnot(length(margins)>1, !is.null(para.list), class(para.list)=="list", length(para.list)==length(margins))
  rmarg <- lapply(paste0("r", margins), get)
  margs.para.list <- lapply(rmarg, function(x) as.list(args(x))[-1])
  margs.para.list <- lapply(margs.para.list, function(x) x[-length(x)])
  for(i in 1:length(para.list)){
    marg.parai <- margs.para.list[[i]]
    user.parai <- para.list[[i]]
    marg.parai.name <- names(marg.parai)
    user.parai.name <- names(user.parai)
    marg.para.np <- length(marg.parai)
    user.para.np <- length(user.parai)
    
    stopifnot(user.para.np > 0)
    if(user.para.np > marg.para.np){
      print(marg.parai)
      print(user.parai)
      print(paste(margins[i], "has less parameters than specified. Then choose!"))
      user.parai <- user.parai[1:(marg.para.np)]
    }
    
    if(user.para.np==marg.para.np){
      if(is.null(user.parai.name)){
        names(user.parai) <- marg.parai.name
        marg.parai <- as.list(user.parai)
      }  
      # To improve this function, consider the case with the existed name and the null name
      if(!is.null(user.parai.name) && (any(user.parai.name %in% marg.parai.name))){ #
        id <- which(user.parai.name %in% marg.parai.name, arr.ind = TRUE)
        user.parai.name[-id] <- marg.parai.name[-id]
        names(user.parai) <- user.parai.name
        marg.parai <- as.list(user.parai)
      }
      
      if(!is.null(user.parai.name) && (!any(user.parai.name %in% marg.parai.name))){ #
        names(user.parai) <- marg.parai.name
        marg.parai <- as.list(user.parai)
      }

    }
    if(user.para.np < marg.para.np){
      if(is.null(user.parai.name)){
        marg.parai[1:user.para.np] <- user.parai
        names(marg.parai) <- marg.parai.name
      }
      if(!is.null(user.parai.name) && (length(user.parai.name) < user.para.np)){
        stop("Spcify all the vector name of parameters")
      }
      
      if(!is.null(user.parai.name) && (length(user.parai.name) == user.para.np) && 
         (!all(user.parai.name %in% marg.parai.name))){
        stop("Check the distribution and the corresponding parameters")
      }
      
      if(!is.null(user.parai.name) && (length(user.parai.name) == user.para.np) && 
        all(user.parai.name %in% marg.parai.name)){
        marg.parai[user.parai.name] <- as.list(user.parai)
      }
    }
    margs.para.list[[i]] <- marg.parai
  }
  for(i in 1:length(margs.para.list)){
    if(margins[i]=="gamma"){
      user.parai <- para.list[[i]]
      user.namei <- names(user.parai)
      if(is.null(user.namei)){
        margs.para.list[[i]] <- margs.para.list[[i]][c("shape", "rate")]
      }
      if(any(user.namei %in% c("shape", "rate", "scale")) && length(user.namei)==2){
        stopifnot("shape" %in% user.namei)
        margs.para.list[[i]] <- margs.para.list[[i]][user.namei]
      }
      if(any(user.namei %in% c("shape", "rate", "scale")) && length(user.namei)==1){
        if(user.namei=="shape"){
          x <- c(user.namei, "rate")
          margs.para.list[[i]] <- margs.para.list[[i]][x]
        }
        if((user.namei=="rate") || (user.namei=="rate")){
          x <- c(user.namei, "shape")
          margs.para.list[[i]] <- margs.para.list[[i]][x]
        }
      }
    }
  }
  names(margs.para.list) <- margins
  margs.para.list
}