###############################################################################
# Function_ImportData.R: Develop general functions for importing (a)biotic data

# Written by Wout Van Echelpoel (UGent)
# Wout.VanEchelpoel@UGent.be - Sep 2021
###############################################################################

###############################################################################
# 0 - Libraries
###############################################################################
library(sf) # For using webservices
###############################################################################

###############################################################################
# 1 - Static part
###############################################################################
# No 'static' part
###############################################################################

###############################################################################
# 2 - Script
###############################################################################
# Define function for abiotic data
f.importAbioticData <- function(param, start = 2015, end = 2021){
  # Define time period
  v.years <- c(start:end)
  
  # Define fixed elements of URL
  v.url <- c('https://geo.vliz.be/geoserver/wfs/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=Dataportal%3Aabiotic_observations&resultType=results&viewParams=where%3Aobs.context+%26%26+ARRAY%5B1%5D+AND+standardparameterid+IN+%28',
             '%29+AND+%28%28datetime_search+BETWEEN+%27',
             '-01-01%27+AND+%27',
             '-12-32%27+%29%29%3Bcontext%3A0001%3Bloggedin%3A1&propertyName=stationname%2Clongitude%2Clatitude%2Cdatetime%2Cdepth%2Cparametername%2Cvaluesign%2Cvalue%2Cunit%2Cdataprovider%2Cdatasettitle%2Clod%2Cloq%2Ccategory%2Cseason%2Cclassunit%2Cclass%2Caphiaid%2Cdateprecision%2Cdatafichetitle%2Cdataficheid%2Cstandardparameterid&outputFormat=json')
  
  # Define parameter-specific section of URL
  n.par <- paste(param, collapse = '%5C%2C')
  
  # Define temporary list for output
  lst.dat <- list()
  
  # Import data for each year
  for (i in 1:length(v.years)) {
    message(paste0('Import for year ', v.years[i]))
    # Compose year-specific URL and import data
    s.url <- paste0(v.url[1], n.par, v.url[2], v.years[i], v.url[3], 
                    v.years[i], v.url[4])
    lst.dat[[i]] <- data.frame(st_read(s.url, stringsAsFactors = F, quiet = T))
    
    # Print feedback to user
    if (nrow(lst.dat[[i]]) == 0) { 
      message(paste0('---No data for year ', v.years[i], '---'))
    } else {
      message(paste0('---Data for year ', v.years[i], ' added---'))
    }
  }
  
  # Generate dataframe from list
  df.dat <- do.call(rbind, lst.dat)
  
  # Generate output
  return(df.dat)
}

# Define function for biotic data
f.importBioticData <- function(param, start = 2015, end = 2021, id = 'imis'){
  # Check if input has correct options
  if(!tolower(id) %in% c('imis', 'aphia')){
    stop("Options for 'id' are 'imis' (dataset) and 'aphia' (soort).", call. = F)
  }
  
  # Define time period
  v.years <- c(start:end)
  
  # Define fixed elements of URL, separate between imis and aphia
  if(id == 'imis'){
    v.url <- c('http://geo.vliz.be/geoserver/wfs/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=Dataportal%3Abiotic_observations&resultType=results&viewParams=where%3Aobs.context+%26%26+ARRAY%5B1%5D+AND+imisdatasetid+IN+%28',
               '%29+AND+%28%28datetime_search+BETWEEN+%27',
               '-01-01%27+AND+%27',
               '-12-32%27+%29%29%3Bcontext%3A0001%3Bloggedin%3A1&propertyName=stationname%2Caphiaid%2Cscientificname%2Cobservationdate%2Clongitude%2Clatitude%2Cvalue%2Cparametername%2Cdataprovider%2Cimisdatasetid%2Cdatasettitle%2Cdatafichetitle%2Cdataficheid%2Careaname%2Cdateprecision%2Cstadium%2Cgender%2Cvaluesign%2Cdepth%2Cclassunit%2Cclass%2Cstandardparameterid&outputFormat=csv')
  } else {
    v.url <- c('http://geo.vliz.be/geoserver/wfs/ows?service=WFS&version=1.1.0&request=GetFeature&typeName=Dataportal%3Abiotic_observations&resultType=results&viewParams=where%3Aobs.context+%26%26+ARRAY%5B1%5D+AND+%28%28datetime_search+BETWEEN+%27',
               '-01-01%27+AND+%27',
               '-12-32%27+%29%29%3Bcontext%3A0001%3Baphiaid%3A',
               '%3Bloggedin%3A1&propertyName=stationname%2Caphiaid%2Cscientificname%2Cobservationdate%2Clongitude%2Clatitude%2Cvalue%2Cparametername%2Cdataprovider%2Cimisdatasetid%2Cdatasettitle%2Cdatafichetitle%2Cdataficheid%2Careaname%2Cdateprecision%2Cstadium%2Cgender%2Cvaluesign%2Cdepth%2Cclassunit%2Cclass%2Cstandardparameterid&outputFormat=csv')
  }
  
  # Define parameter-specific section of URL
  n.par <- paste(param, collapse = '%5C%2C')
  
  # Define temporary list for output
  lst.dat <- list()
  
  # Import data for each year
  for (i in 1:length(v.years)) {
    message(paste0('Import for year ', v.years[i]))
    # Compose year-specific URL and import data
    if(id == 'imis'){
      s.url <- paste0(v.url[1], n.par, v.url[2], v.years[i], v.url[3], 
                      v.years[i], v.url[4])
    } else {
      s.url <- paste0(v.url[1], v.years[i], v.url[2], v.years[i], v.url[3], 
                      n.par, v.url[4])
    }
    
    lst.dat[[i]] <- data.frame(st_read(s.url, stringsAsFactors = F, quiet = T))
    
    # Print feedback to user
    if (nrow(lst.dat[[i]]) == 0) { 
      message(paste0('---No data for year ', v.years[i], '---'))
    } else {
      message(paste0('---Data for year ', v.years[i], ' added---'))
    }
  }
  
  # Generate dataframe from list
  df.dat <- do.call(rbind, lst.dat)
  
  # Generate output
  return(df.dat)
}

###############################################################################

###############################################################################
# 3 - Remove excess variables
###############################################################################
# No excess variables
###############################################################################