library(jsonlite)
# Input Parameters
csvpath <- '/home/local/ASSYST-COC/navin.v.i/dev/MetadataEditor/MetadataEditor/MetadataEditor.Import/ExportTest.csv'
source("/home/local/ASSYST-COC/navin.v.i/dev/MetadataEditor/MetadataEditor/MetadataEditor.Import/scripts/fn.calculate.varStats.R")
typeOfActions <- fromJSON('[
                                  {
                                    "action":"destring",
                                    "name":"hhid",
                                    "properties":[]
                                  },
                                  {
                                    "action":"destring",
                                    "name":"indid",
                                    "properties":[]
                                  },
                                  {
                                    "action":"encodeMissing",
                                    "name":"age",
                                    "properties":[
                                      {"op":"=","val":999},
                                      {"op":"=","val":9999},
                                      {"op":"<=","val":21}
                                    ]
                                  },
                                  {
                                    "action":"encodeMissing",
                                    "name":"H16A_1",
                                    "properties":[
                                      {"op":"=","val":98}
                                    ]
                                  }
                             ]')



listOfVariables <- typeOfActions[,'name']

# Read csv header to pick the column names
csvHeader <- as.character(read.csv(file=csvpath, nrows = 1, header = FALSE, sep =',', stringsAsFactors = FALSE))
matchingVariables <- intersect(listOfVariables, csvHeader)

# Read CSV and create DF for matching variables
csvData <- read.csv(file=file(csvpath, encoding="UTF-8"), header=TRUE, sep = ",")
DF_DATA <- data.frame(csvData)
matchingDF <- DF_DATA [,matchingVariables]

#CALCULATE stats FOR variables that were DESTRINGED
destringInputActionsPredicate <- typeOfActions$action=='destring'
destringInputActions <- typeOfActions[destringInputActionsPredicate,c('name','properties')]
destringedVarStatsList <- NA
if (length(destringInputActions) >= 1) {
  destringedVarStatsList <- lapply(destringInputActions$name,function(varName){
    if (sapply(matchingDF[varName], is.numeric)) {
      calculate.varStats(matchingDF,varName)
    }
  })
}

#CALCULATE stats FOR variables that were ENCODED WITH MISSING VALUES
encMissInputActionsPredicate <- typeOfActions$action=='encodeMissing'
encMissInputActions <- typeOfActions[encMissInputActionsPredicate,c('name','properties')]
encMissVarStatsList <- lapply(encMissInputActions$name,function(varName){
  if (sapply(matchingDF[varName], is.numeric)) {
    # Replace the DF data with NA for user specified missing values
    missingData <- subset(encMissInputActions, name==varName)[,2][[1]]
    # missingData ->
    #    op  val
    # 1  =   999
    # 2  >=   40
    # 3  <=   57
    
    equalOpPredicate <- missingData$op == '='
    equalOpData <- missingData[equalOpPredicate,]
    replaceValPredicate <- matchingDF[,varName] %in% equalOpData$val

    gteOpPredicate <- missingData$op == '>='
    gteOpData <- missingData[gteOpPredicate,]
    lteOpPredicate <- missingData$op == '<='
    lteOpData <- missingData[lteOpPredicate,]

    if (length(gteOpData$op) >= 1 && length(lteOpData$op) >= 1) {
      replaceValPredicate <- replaceValPredicate | (matchingDF[,varName] >= gteOpData$val &  matchingDF[,varName] <= lteOpData$val)
    } else if (length(gteOpData$op) >= 1) {
      replaceValPredicate <- replaceValPredicate | (matchingDF[,varName] >= gteOpData$val)
    } else if (length(lteOpData$op) >= 1) {
      replaceValPredicate <- replaceValPredicate | (matchingDF[,varName] <= lteOpData$val)
    }

    matchingDF[replaceValPredicate,varName]<-NA

    calculate.varStats(matchingDF,varName)
  }
})

statsList <- list(destringedVarStatsList,encMissVarStatsList)

# return number of records
statsJson <- toJSON(statsList,pretty=TRUE,force=TRUE)

return (statsJson)