categoryCheck <- function(categories, logger){
  catnames <- c("Bull", "DryCow", "Heifer", "LactCow", "SucklingCalves", "WeanedCalves")
  
  if(!all(categories %in% catnames)){
    dff <- setdiff(categories, catnames)
    
    log4r::fatal(logger, paste0("Accepted category names are '", paste0(catnames, collapse = "', '"), "'."))
    stop()
  }
}

categoriesSetting <- function(filepath, logger, diets, mthnames){
  
  df <- readDF(filepath = filepath, sht = "Category", logger = logger, skip = 2)
  
  if(length(df) == 0){
    log4r::fatal(logger, "Input file has empty Category sheet.")
    stop()
  }
  
  allCol <- c("Category", "wastingManageType", "isStabled", "Sex", "Morty", "Num", mthnames)
  if(!all(colnames(df) %in% allCol)){
    log4r::fatal(logger, paste0("Category's sheet columns must be: '", paste0(allCol, collapse = "', '"), "', respectively."))
    stop()
  }
  
  auxDF <- df[df$Num != 0,]
  
  if(any(is.na(auxDF[,allCol]))){ 
    log4r::fatal(logger, paste0("Empty information: columns '", paste0(allCol, collapse = "', '"), "' must be completely filled."))
    stop()
  }
  
  if(any(is.na(df[,"Category"]))){
    log4r::fatal(logger, "Empty information: No category listed or listed incorrectly.")
    stop()
  }
  
  categoryCheck(categories = df[,"Category"], logger = logger)

  df[is.na(df["Num"]),"Num"] <- 0

  for(cn in df[,"Category"]){
    if(df[df$Category == cn, "Num"] != 0){
      df[df$Category == cn, mthnames] <- paste0(cn, "_", df[df$Category == cn, mthnames])
    }
  }

  currentHerd <- data.frame(Category = df["Category"], Num = df["Num"])
  
  stringDefault <- c("anaerobic lagoon", "biodigester", "solid storage")
  
  df[["wastingManageType"]] <- tolower(df[["wastingManageType"]])
  
  auxDF <- df[df$Num != 0,]
  
  if(!any(auxDF[["wastingManageType"]] %in% stringDefault)){
    diffNames <- setdiff(auxDF["wastingManageType"], stringDefault)
    log4r::fatal(logger, paste0("Waste manage type's '", paste0(diffNames, collapse = "', '"),"' are not supported."))
    stop()
  }
  
  stringDefault <- c("yes", "no")
  
  df[["isStabled"]] <- tolower(df[["isStabled"]])
  
  auxDF <- df[df$Num != 0,]
 
  if(!any(auxDF[["isStabled"]] %in% stringDefault)){
    diffNames <- setdiff(auxDF["isStabled"], stringDefault)
    log4r::fatal(logger, "If there is animals in herd, stabled situation must be stablished: TRUE or FALSE.")
    stop()
  }

  df[df$Num == 0, mthnames] <- NA
  
  typenames <- df[,"Category"]
  df[,"Category"] <- NULL
  inpData <- split(df, 1:nrow(df))
  names(inpData) <- typenames
  
  dietCheck(diets = names(diets), category = inpData, mthnames = mthnames, logger = logger)
  
  return(list(Category = inpData, currentHerd = currentHerd))
}

