# Input Parameters
# csvpath <- '/home/local/ASSYST-COC/navin.v.i/dev/MetadataEditor/MetadataEditor/MetadataEditor.Import/F1_ghs_2015_person_v1.1_20160608.csv'
csvpath <- input[[1]]
#it should have the following format. NOTE: IF THE NUMBER OF VARIABLES IN INPUT IS HIGH WE HAVE TO HAVE AN ALTERNATE METHOD
# listOfVariables <- fromJSON('[
#   {"internalName" : "uqnr", "type" : "character"},
#   {"internalName" : "personnr", "type" : "character"},
#   {"internalName" : "psu", "type" : "character"}
# ]')
listOfVariables <- fromJSON(input[[2]])
libPath <- input[[3]]
workingDirectory <- input[[4]]

# libPath <- '/home/local/ASSYST-COC/navin.v.i/R/x86_64-redhat-linux-gnu-library/3.2'
if(libPath == "MAC") {
  libPath <- NULL
  Sys.setlocale(category = "LC_ALL", locale = "UTF-8")
}
if (is.null(libPath) || libPath == '') {
  library(haven)
  library(jsonlite)
  library(readr)
} else {
  .libPaths(libPath)
  library(haven, lib.loc=libPath)
  library(jsonlite, lib.loc=libPath)
  library(readr, lib.loc=libPath)
}
#stringLen: application will set the character.width as StringLen initially. Resequencing can change it
#Width vs StringLen:For string width should be maximum it can hold, StringLen: Should be maximum length of character in data

# Set working directory
setwd(workingDirectory);
# Load functions
source("fn.common.utilities.R")

# Read csv header to pick the column names and get the matching variables
csvHeader <- as.character(read_csv(file=csvpath, n_max = 1, col_types = cols(.default = "c"), col_names = FALSE))
matchingVariables <- intersect(listOfVariables$internalName, csvHeader)

# read data file
DF_DATA <- read.datafile(listOfVariables, file=csvpath)

DF_DATA <- data.frame(DF_DATA)
matchingDF <- DF_DATA[,matchingVariables]

if (class(matchingDF) == "data.frame") {
  #Get max of variable
  maxLengthDF <- sapply(matchingDF, function(x) {
      c(max(nchar(x), na.rm=T))
  })
} else {
  maxLengthDF <- max(nchar(matchingDF), na.rm=T)
}

# return number of records
result <- toJSON(maxLengthDF,pretty=TRUE,force=TRUE)

return (result)
