#source("C:/Users/Turry/Documents/ACAI/ACAI_dwnld_briefCase2/ODK_functions.R")
library(RCurl)
library(httr)
library(ona)

# setwd("C:/Users/Turry/Documents/ACAI")
# forms <- c("Register_PC", "Register_EX", "Assign_FDTLPO", "Collect_SS", "Describe_FD", "Measure_Cassava_PO", 
#            "Measure_Potato_PO", "RecordMgt_TL")
# target <-  "C:/Users/Turry/Documents/ACAI/ACAI_dwnld_briefCase2"
# userName = "turry.ouma@gmail.com"
# password = "Nya8u8a!"
# Export_To = "C:/Users/Turry/Documents/ACAI/ACAI_dwnld_briefCase2/datasav"

setwd("/home/akilimo/Sandman")
forms <- c("Register_PC", "Register_EX", "Assign_FDTLPO", "Collect_SS")
target <-  "/home/akilimo/Sandman"
userName = "turry.ouma@gmail.com"
password = "Nya8u8a!"
Export_To = "/home/akilimo/Sandman/datasav"
briefCaseDwnld(forms=forms, target=target, source="ONA")
setwd(target)


setwd('/home/akilimo/Sandman')
tar <- "/home/akilimo/Sandman"
pullTo <- "/home/akilimo/Sandman"
userName <- "mtariku"
passWord <- "applenose"
Export_To <- "/home/akilimo/Sandman"

briefCaseDwnld(forms=forms, target=target, source="ONA")
setwd(target)

# Get tokens from ona
raw.result <- GET("https://api.ona.io/api/v1/user.json", authenticate(user = "touma",password = "Nya8u8a!"))
raw.result.char<-rawToChar(raw.result$content)
raw.result.json<-fromJSON(raw.result.char)
TOKEN_KEY <- raw.result.json$temp_token
xformf <- c("523975", "526510", "526492", "523993", "526553", "526549")
xformt <- c("523975", "526510", "523993", "526553", "526549")
xformp <- c("523975", "526510", "523993", "526553")
xformpr <- c("523975", "523974","523971")

#Reading in registered projects and experiments
dsPC <- dropGroupNames(read.csv("Register_PC.csv", stringsAsFactors = FALSE, na.strings=c(""," ","NA")))
dsPC$project <- ifelse(is.na(dsPC$project), dsPC$project_abbr, dsPC$project)

dsEX1 <- dropGroupNames(read.csv("Register_EX.csv", stringsAsFactors = FALSE, na.strings=c(""," ","NA")))
dsEX2 <- dropGroupNames(read.csv("Register_EX-treatmentRepeat.csv", stringsAsFactors = FALSE, na.strings=c(""," ","NA")))
dsEX  <- mergeODKforms(dsEX1, dsEX2)

dsAS1 <- dropGroupNames(read.csv("Assign_FDTLPO.csv", stringsAsFactors = FALSE, na.strings=c(""," ","NA")))
dsAS2 <- dropGroupNames(read.csv("Assign_FDTLPO-trial.csv", stringsAsFactors = FALSE, na.strings=c(""," ","NA")))
dsAS3 <- dropGroupNames(read.csv("Assign_FDTLPO-plot.csv", stringsAsFactors = FALSE, na.strings=c(""," ","NA")))

setwd("/home/akilimo/Sandman/created forms/media files")
#creating projects.csv for ODK to select existing projects and projectCodes
projects <- unique(na.omit(subset(dsPC, select=c(project, projectCode))))
projects$project_label <- projects$project
write.csv(projects, "projects.csv", row.names = FALSE)

#-------------------------------------------------------------

for (i in xformpr) {
  # delete existing projects.csv
  
  meta_projectsID = readChar("projects.txt", 10)
  hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
  DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_projectsID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))
  
  new_projects_id = ''
  while(new_projects_id ==''){
    
    # upload the csv files
    header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
    post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                  data_value='projects.csv',data_type='media',xform=i,
                                  data_file=fileUpload(filename = "projects.csv",contentType = 'text/csv'),
                                  .opts=list(httpheader=header), verbose = TRUE)
    # get user ID
    trials.raw.result.json<-fromJSON(post.user.results)
    new_projects_id <- trials.raw.result.json$id
  }
  cat(new_projects_id, file = "projects.txt")
}
#-------------------------------------------------------------

#creating countries.csv for ODK to select existing countries for each project
countries <- strsplit(dsPC$country, split = " ")
countries <- data.frame(project = rep(dsPC$project, sapply(countries, length)), 
                        country = unlist(countries))
countries <- merge(countries, unique(na.omit(subset(dsPC, select=c(project, projectCode)))))
countries <- unique(countries)
countries <- merge(countries, read.csv("africancountries.csv"))
countries <- countries[order(countries$projectCode),]
write.csv(countries, "countries.csv", row.names = FALSE)

#--------------------------------------------------------------
#delete existing countries.csv

meta_exp_cID = readChar("countries.txt", 10)
hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_exp_cID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))

new_co_id = ''
while(new_co_id ==''){
  
  # upload csv
  header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
  post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                data_value='countries.csv',data_type='media',xform=523971,
                                data_file=fileUpload(filename = "eexperiments_countries.csv",contentType = 'text/csv'),
                                .opts=list(httpheader=header), verbose = TRUE)
  # get user ID
  trials.raw.result.json<-fromJSON(post.user.results)
  new_co_id <- trials.raw.result.json$id
}
cat(new_co_id, file = "countries.txt")

#-------------------------------------------------------------

#creating experiments.csv to select existing experiments for each project
experiments <- subset(dsEX1, select=c(project, projectCode, expName, expFamily, expVersion, expCode, expCode_label, nrTreats))
experiments <- unique(na.omit(experiments))
write.csv(experiments, "experiments.csv", row.names = FALSE)

#--------------------------------------------------------------
#delete existing experiments.csv

meta_exp_cID = readChar("experiments.txt", 10)
hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_exp_cID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))

new_exp_id = ''
while(new_exp_id ==''){
  
  # upload csv
  header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
  post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                data_value='experiments.csv',data_type='media',xform=523971,
                                data_file=fileUpload(filename = "eexperiments_countries.csv",contentType = 'text/csv'),
                                .opts=list(httpheader=header), verbose = TRUE)
  # get user ID
  trials.raw.result.json<-fromJSON(post.user.results)
  new_exp_id <- trials.raw.result.json$id
}
cat(new_exp_id, file = "experiments.txt")

#-------------------------------------------------------------
#creating expIDs.csv to select existing expIDs
experiments_countries <- subset(dsEX1, select=c(expCode, expCode_copy, country))
experiments_countries$expCode <- ifelse(is.na(experiments_countries$expCode), experiments_countries$expCode_copy, experiments_countries$expCode)
experiments_countries <- subset(experiments_countries, select=-expCode_copy)
experiments_countries <- merge(experiments_countries, experiments)
experiments_countries <- unique(na.omit(experiments_countries))
write.csv(experiments_countries, "experiments_countries.csv", row.names = FALSE)

#--------------------------------------------------------------
#delete existing experiment_countries.csv

meta_exp_cID = readChar("exp_c.txt", 10)
hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_exp_cID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))

new_exp_c_id = ''
while(new_exp_c_id ==''){
  
  # upload csv
  header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
  post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                data_value='experiments_countries.csv',data_type='media',xform=523975,
                                data_file=fileUpload(filename = "eexperiments_countries.csv",contentType = 'text/csv'),
                                .opts=list(httpheader=header), verbose = TRUE)
  # get user ID
  trials.raw.result.json<-fromJSON(post.user.results)
  new_exp_c_id <- trials.raw.result.json$id
}
cat(new_exp_c_id, file = "exp_c.txt")

#-------------------------------------------------------------

#creating treatments.csv to obtain list of treatments by expCode
treatments <- subset(dsEX, select=c(expCode, treatNr, treatCode_label, treatName, treatCode))
treatments$expCode_treatNr <- paste0(treatments$expCode, "_", treatments$treatNr)
treatments <- unique(na.omit(treatments))
write.csv(treatments, "treatments.csv", row.names = FALSE)

#-------------------------------------------------------------
#delete treatments.csv

meta_treatmentsID = readChar("treatments.txt", 10)
hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_treatmentsID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))

new_treatments_id = ''
while(new_treatments_id ==''){
  
  # upload csv
  header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
  post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                data_value='treatments.csv',data_type='media',xform=523975,
                                data_file=fileUpload(filename = "treatments.csv",contentType = 'text/csv'),
                                .opts=list(httpheader=header), verbose = TRUE)
  # get user ID
  trials.raw.result.json<-fromJSON(post.user.results)
  new_treatments_id <- trials.raw.result.json$id
}
cat(new_treatments_id, file = "treatments.txt")

#-------------------------------------------------------------
#creating fields.csv
fields <- subset(dsAS1, select=c(FDID2_new, FD_name_new, projectCode, country, lonr, latr))
fields <- unique(na.omit(fields))
fields <- fields[rep(seq_len(nrow(fields)), each=9),]
fields$lonr <- fields$lonr + rep(c(-0.005, 0, 0.005), 3)
fields$latr <- fields$latr + rep(c(-0.005, 0, 0.005), each=3)
fields$lookup <- paste0(fields$projectCode, fields$country, "_E", fields$lonr, "N", fields$latr)
fields <- subset(fields, select = -c(projectCode, country, lonr, latr))
fields <- data.frame(FDID2 = fields$FDID2_new,
                     FDID2_label = fields$FD_name_new,
                     lookup = fields$lookup)
write.csv(fields, "fields.csv", row.names = FALSE)

#-------------------------------------------------------------
#delete and upload media files
for (i in xformf) {
  #delete existing fields.csv
  meta_fieldsID = readChar("fields.txt", 10)
  hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
  DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_fieldsID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))
  
  new_fields_id = ''
  while(new_fields_id ==''){
    
    # upload csv
    header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
    post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                  data_value='fields.csv',data_type='media',xform=i,
                                  data_file=fileUpload(filename = "fields.csv",contentType = 'text/csv'),
                                  .opts=list(httpheader=header), verbose = TRUE)
    # get user ID
    trials.raw.result.json<-fromJSON(post.user.results)
    new_fields_id <- trials.raw.result.json$id
  }
  
  cat(new_fields_id, file = "fields.txt")
}

#-------------------------------------------------------------
#creating trials.csv
trials <- subset(mergeODKforms(dsAS1, dsAS2), select=c(TLID2_new, TL_name_new, FDID2_new, FDID2))
trials$FDID2 <- ifelse(is.na(trials$FDID2), trials$FDID2_new, trials$FDID2)
trials <- subset(trials, select=-FDID2_new)
trials <- unique(na.omit(trials))
trials <- trials[order(trials$TL_name_new),]
names(trials)[names(trials)=="TLID2_new"] <- "TLID2"
names(trials)[names(trials)=="TL_name_new"] <- "TLID2_label"
write.csv(trials, "trials.csv", row.names = FALSE)

#-------------------------------------------------------------
#delete and upload media files

for (i in xformt) {
  #delete existing trials.csv
  meta_trialsID = readChar("trials.txt", 10)
  hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
  DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_trialsID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))
  
  new_trials_id = ''
  while(new_trials_id  ==''){
    
    # upload csv
    header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
    post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                  data_value='trials.csv',data_type='media',xform=i,
                                  data_file=fileUpload(filename = "trials.csv",contentType = 'text/csv'),
                                  .opts=list(httpheader=header), verbose = TRUE)
    # get user ID
    trials.raw.result.json<-fromJSON(post.user.results)
    new_trials_id  <- trials.raw.result.json$id
  }
  cat(new_trials_id , file = "trials.txt")
}
#-------------------------------------------------------------

#creating plots.csv
plots <- subset(mergeODKforms(dsAS1, dsAS2, dsAS3), select=c(POID2_new, plotName, TLID2_new, TLID2))
plots$TLID2 <- ifelse(is.na(plots$TLID2), plots$TLID2_new, plots$TLID2)
plots <- subset(plots, select=-TLID2_new)
plots <- unique(na.omit(plots))
names(plots)[names(plots)=="POID2_new"] <- "POID2"
names(plots)[names(plots)=="plotName"] <- "POID2_label"
write.csv(plots, "plots.csv", row.names = FALSE)

#-------------------------------------------------------------
#delete and upload media files
for (i in xformp) {
  #delete existing plots.csv
  
  meta_plotsID = readChar("plots.txt", 10)
  hdr=c(Authorization=paste("Temptoken ",TOKEN_KEY))
  DELETE(paste("https://api.ona.io/api/v1/metadata/",meta_plotsID),add_headers(Authorization=paste("Temptoken ",TOKEN_KEY)))
  
  new_plots_id = ''
  while(new_plots_id ==''){
    
    # upload csv
    header=c(Authorization=paste("Temptoken ", TOKEN_KEY), `Content-Type` = 'multipart/form-data')
    post.user.results <- postForm("https://api.ona.io/api/v1/metadata.json",
                                  data_value='plots.csv',data_type='media',xform=i,
                                  data_file=fileUpload(filename = "plots.csv",contentType = 'text/csv'),
                                  .opts=list(httpheader=header), verbose = TRUE)
    # get user ID
    plots.raw.result.json<-fromJSON(post.user.results)
    new_plots_id <- plots.raw.result.json$id
  }
  cat(new_plots_id, file = "plots.txt")
} 
#-------------------------------------------------------------
