plotsCheck <- function(plots, transMtx){
  
  # floatPars <- c("area", "initialCStockOriginal", "totalSand", "silt", "clay", 
  #               "initialCStock", "limestoneDose", "destinationNitrogenDose", 
  #               "nitrogenAsUrea", "destinationAddOrganicMat", "destinationProdCapacity",
  #               "sourceNitrogenDose", "sourceAddOrganicMat", "sourceProdCapacity")
  floatPars <- c("area", "initialCStock", "limestoneDose", "destinationNitrogenDose", 
                 "nitrogenAsUrea", "sourceNitrogenDose")
  
  # integerPars <- c("conversionYear", "destinationRenovPeriod", "sourceRenovPeriod")
  
  #stringPars <- c("destinationUseType", "destinationPlant", "destinationSoilPrep",
  #                "destinationProdType", "sourceUseType", "sourcePlant", 
  #                "sourceSoilPrep", "sourceProdType")
  stringPars <- c("destinationUseType", "sourceUseType")
  
  validPlots <- NULL
  for(p in c("Plot1", "Plot2", "Plot3", "Plot4", "Plot5")){
    inputPlts <- setNames(as.list(plots[,p]), plots[,"Parameter"])
    vectPlts <- unlist(inputPlts[c(floatPars, stringPars)])
    
    if(all(is.na(vectPlts))){
      log4r::warn(logger, paste0("Empty required information in ", p, ". Plot disregarded for emissions calculations."))
    }else if(any(is.na(vectPlts))){
        NAnames <- names(vectPlts)[which(is.na(vectPlts))]
        log4r::fatal(logger, paste0("Missing required information in ", p, ": '", paste0(NAnames, collapse = "', '"), "'."))
        stop()
    }else{
      validPlots <- c(validPlots, p)
    }
  }
  
  if(length(validPlots) == 0){
    return(NULL)
  }
  
  plotsList <- list()
  
  for(p in validPlots){
    pltList <- setNames(as.list(plots[,p]), plots[,"Parameter"])

    for(v in floatPars){
      if(v %in% names(pltList)){
        pltList[[v]] <- turnIntoVector(inpvar = pltList[[v]])
      }
    }
    
    matrixStrings <- colnames(transMtx)
    
    for(v in stringPars){
      if(v %in% names(pltList)){
        if(tolower(pltList[[v]]) %in% matrixStrings){
          pltList[[v]] <- tolower(pltList[[v]])
        }else{
          log4r::fatal(logger, paste0("Type '", v,"' is not a valid name. Please check possible typos."))
          stop()
        }
      }
    }
    
    plotsList[[p]] <- pltList
  }
  
  return(plotsList)
}

plotsSetting <- function(filepath, transMtx, logger){
  
  df <- readDF(filepath = filepath, sht = "Plots", logger = logger)
  
  allCol <- c("Parameter", "Description", "Unit", "Plot1", "Plot2", "Plot3", "Plot4", "Plot5")
  if(!all(colnames(df) %in% allCol)){
    log4r::fatal(logger, paste0("Plots' sheet columns must be: '", paste0(allCol, collapse = "', '"), "', respectively."))
    stop()
  }
  
  allPlots <- plotsCheck(plots = df, transMtx = transMtx)
  
  return(allPlots)
}

plotsCalculations <- function(plots, pars){
  
  areaCategory <- pars$areaCategory
  
  pastArea     <- 0
  NFertPast    <- 0
  PropUreaPast <- 0
  LimePast     <- 0
  
  supplArea     <- 0
  NFertSuppl    <- 0
  PropUreaSuppl <- 0
  LimeSuppl     <- 0
  
  for(p in names(plots)){
    if(areaCategory[[plots[[p]][["destinationUseType"]]]] == "pastArea"){
      
      pastArea     <- pastArea     + plots[[p]][["area"]]
      NFertPast    <- NFertPast    + plots[[p]][["destinationNitrogenDose"]] * plots[[p]][["area"]]
      PropUreaPast <- PropUreaPast + plots[[p]][["nitrogenAsUrea"]]          * plots[[p]][["area"]]
      LimePast     <- LimePast     + plots[[p]][["limestoneDose"]]           * plots[[p]][["area"]]
      
    }else if(areaCategory[[plots[[p]][["destinationUseType"]]]] == "supplArea"){
      
      supplArea     <- supplArea     + plots[[p]][["area"]]
      NFertSuppl    <- NFertSuppl    + plots[[p]][["destinationNitrogenDose"]] * plots[[p]][["area"]]
      PropUreaSuppl <- PropUreaSuppl + plots[[p]][["nitrogenAsUrea"]]          * plots[[p]][["area"]]
      LimeSuppl     <- LimeSuppl     + plots[[p]][["limestoneDose"]]           * plots[[p]][["area"]]
    
    }
  }
  
  if(pastArea == 0){
    NFertPast    <- 0
    PropUreaPast <- 0
    LimePast     <- 0
  }else{
    NFertPast    <- NFertPast / pastArea
    PropUreaPast <- PropUreaPast / pastArea
    LimePast     <- LimePast / pastArea
  }
  
  if(supplArea == 0){
    NFertSuppl    <- 0 
    PropUreaSuppl <- 0 
    LimeSuppl     <- 0  
  }else{
    NFertSuppl    <- NFertSuppl / supplArea
    PropUreaSuppl <- PropUreaSuppl / supplArea
    LimeSuppl     <- LimeSuppl / supplArea
  }
  
  res <- list(
    pastArea      = pastArea,
    supplArea     = supplArea,
    NFertPast     = NFertPast,
    PropUreaPast  = PropUreaPast,
    LimePast      = LimePast,
    NFertSuppl    = NFertSuppl,
    PropUreaSuppl = PropUreaSuppl,
    LimeSuppl     = LimeSuppl)
  
  return(res)
}