### fn.calculate.var_stats
###------------------------------------------------------------------------------------------
### What: function to match csv column header with variable name and recalculate the statistics
### Time-stamp: <2018-01-29 11:21:27 assyst>
###-------------------------------------------------------------------------------------------

summary.stats <- function(df,
                             varName,
                             ...)
{

  # set options digits (22 - max value) to make sure decimal precision not lost in aritmetic operations(MIN, MAX)
  # option.digits <- getOption("digits")
  # on.exit( function() options("digits"=option.digits) )
  # options("digits"=22)

  minValue <- NA
  maxValue <- NA
  meanValue <- NA
  stdDevValue <- NA

  if (sapply(df[varName], is.numeric)) {
    if(all(is.na(df[varName]))){
      minValue <- "*"
      maxValue <- "*"
      meanValue <- "*"
      stdDevValue <- "*"
    } else { 
      #calculate satistics  
      minValue <- min(df[varName], na.rm=T)
      maxValue <- max(df[varName], na.rm=T)
      meanValue <- sapply(df[varName], mean, na.rm = TRUE)
      stdDevValue <- sapply(df[varName], sd, na.rm = TRUE)
    }
  }  

  invalids <- sum(is.na(df[varName]))
  valids <-  sum(!is.na(df[varName]))

  statsList <- list(min=minValue,max=maxValue,mean=meanValue,stdev=stdDevValue,vald=valids,invd=invalids)
     
  return(statsList)
  
}

calculate.varStats <- function(df,
                             varName,
                             ...)
{
  #calculate satistics  
  # summary statistics logic moved to new fn: to reuse the logic in import data
  statistics <- summary.stats(df, varName)

  statsList <- list(
    valrng=list(range=list(min=statistics$min,max=statistics$max,mean=statistics$mean,stdev=statistics$stdev,name=varName)),
    sumStat=list(list(type="vald",text=statistics$vald),list(type="invd",text=statistics$invalids))
  )
  
  return(statsList)
  
}

calculate.catFrequency <- function(df, 
                                catgryDF, 
                                varName, 
                                ... )
{
  # calculate frequency of the given categories
  freqTable <- count(df, varName)
  colnames(freqTable) <- c("Value","freq")
  
  catgry <- lapply(catgryDF$catValu, function(val){
    if(is.na(val)){
      catg <- catgryDF[is.na(catgryDF$catValu),]
      freq <-  freqTable[is.na(freqTable$Value), 'freq']
    }
    else{
      catg <- na.omit(catgryDF[catgryDF$catValu==val,])
      freq <- na.omit(freqTable[freqTable$Value==val, 'freq'])
    }
    if(length(freq) == 0 || is.na(freq)){
      freq <- 0
    }
    list(catValu=val,labl=catg$labl,labelled=TRUE,catStat=list(type="freq",text=freq))
  })

  return(catgry)

}


# calculate.varStats <- function(df,
#                              varName,
#                              ...)
# {
#   #calculate satistics  
#   minValue <- min(df[varName], na.rm=T)
#   maxValue <- max(df[varName], na.rm=T)
#   meanValue <- sapply(df[varName], mean, na.rm = TRUE)
#   stdDevValue <- sapply(df[varName], sd, na.rm = TRUE)
#   invalids <- sum(is.na(df[varName]))
#   valids <-  sum(!is.na(df[varName]))

#   statsList <- list(
#     valrng=list(range=list(min=minValue,max=maxValue,mean=meanValue,stdev=stdDevValue,name=varName)),
#     sumStat=list(list(type="vald",text=valids),list(type="invd",text=invalids))
#   )
  
#   return(statsList)
  
# }



