#!/usr/bin/env Rscript
# Script valide pour R en version 3.1 et supérieure

# ETAPTE 1 [LA PREMIERE FOIS]
# Installer les packages : httr et openssl

#install.packages('httr')
#install.packages('dplyr')

# ETAPE 2 charger ces packages :
# Permet de gérer les connexions WEB :


#' Web Service data transform
#'
#' @param x a dataset get from smartis
#' @param dataframe a boolean
#'
#' @return return dataframe if dataframe boolean is TRUE else matrix
#' @export
#' @examples
ws_transform<-function(x,dataframe=TRUE){
  if (!requireNamespace("httr", quietly = TRUE)) {
    print('Le paquet httr est requis. Installation...')
    install.packages('httr')
    require(httr)
  }
  data<-httr::content(x)
  if (is.null(data$message)){
    if (is.null(data$rows)){
      d<-data.frame(t(sapply(data,c)))
    }else{
      d<-data.frame(t(sapply(data$rows,c)))
    }
    if (dataframe==FALSE){
      dm<-as.matrix(d)
      d<-dm
      rm(dm)
    }
  }else{
    d<-as.data.frame(data$message)
  }
  return(d)
}


#' Fonction de traitement de la réponse du web service
#'
#' @param credential
#' @param url
#'
#' @return retourne la réponse décodé ou le code erreur -1
#' @export
#'
#' @examples
.ws_response <- function(credential,url){
  if (!requireNamespace("httr", quietly = TRUE)) {
    print('Le paquet httr est requis pour cette fonction, Installation...')
    install.packages('httr')
    require(httr)
  }
  urldef<-paste(url,credential,sep='')

  req <-httr::GET(urldef,httr::add_headers(Accept='application/json'))
  if (req$status_code == 200){
    return(ws_transform(req,TRUE))
  }else{
    return(-1)
  }
}


#' Fonction de validation de l'identité
#'
#' @param username a string is login in smartis
#'
#' @return an authentication object or error if invalide credential
#' @export
#'
#' @examples get_credential('username','9Yvx8UUlSsRs9WR4bjeTp9MCxZjf0z')
get_credential <- function(username,apiKey){
  if (!requireNamespace("httr", quietly = TRUE)) {
    print('Le paquet httr est requis pour cette fonction, Installation...')
    install.packages('httr')
    require(httr)
  }
  url = paste('https://smartis.re/api/WSMeteo?long=55.307965278625495&lat=-21.140868798573788&startdate=2018-01-01&enddate=2018-01-02&format=json&apikey=',apiKey,'&login=',username,sep='')
  req <- httr::GET(url)
  if (req$status_code == 200){
    #test<-ws_transform(req,FALSE)
    return(paste('&apikey=',apiKey,'&login=',username,sep=''))
  }else{
    return(-1)
  }
}


#' Fonction de validation du token
#'
#' @param username a string is login in smartis
#' @param apiKey String of the smartis user's token
#'
#' @return an authentication object or error if invalide credential
#' @export
#'
#' @examples validate_credential('username','qpbsLcCqLutNshgD2gqH4I7MGFcBwe')

validate_credential <- function(username,apiKey){
  if (!requireNamespace("httr", quietly = TRUE)) {
    print('Le paquet httr est requis pour cette fonction, Installation...')
    install.packages('httr')
    require(httr)
  }
  url = paste('https://smartis.re/api/validate_apikey?login=',username,'&api_key=',apiKey,sep='')
  req <- httr::POST(url)
  if (req$status_code == 200){
    result<-httr::content(req)
    return(paste('&apikey=',result$api_key,'&login=',username,sep=''))
  }else{
    return(paste('status code=',req$status_code,sep=''))
  }
}


#' Fonction de récupération de données météo en un point situé à (longitude,latitude)
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param start_date Date de début de la série météo souhaitée
#' @param end_date Date de fin de la série météo souhaitée
#' @param latitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param longitude latitude de lieu ou la série est souhaitée en ° décimaux
#'
#' @return Renvoi une série de donnée incluant Pluie,Rayonnement,Température mini, température maxi, température moyenne et Etp journalière.
#' @export
#'
#' @examples
ws_geo_meteo <- function(credential,start_date,end_date,latitude,longitude){
  url<-paste('https://smartis.re/api/WSMeteo?long=',longitude,'&lat=',latitude,'&startdate=',start_date,'&enddate=',end_date,'&format=json',sep="")
  return(.ws_response(credential,url))
}


#' Fonction de récupération de données météo en pied de la station indiquée par id_station
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param id_station numéro Insee de la station
#' @param start_date Date de début de la série météo souhaitée
#' @param end_date Date de fin de la série météo souhaitée
#' @param presence_header valeur 1 ou 0. 1 => renvoi l'entete avec les données, 0 => renvoi uniquement les données
#'
#' @return Renvoi une série de donnée sous forme CNA
#' @export
#'
#' @examples
ws_mf_meteo <- function(credential,id_station,start_date,end_date,presence_header){
  url<-paste('https://smartis.re/api/GET_CLIM_DATA_CIRAD?idstation=',id_station,'&startdate=',start_date,'&enddate=',end_date,'&haeder=',presence_header,'&format=json',sep="")
  return(.ws_response(credential,url))
}


#' Fonction de récupération de données météo en pied de la station indiquée par id_station.
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param id_station numéro Insee de la station
#' @param start_date Date de début de la série météo souhaitée
#' @param end_date Date de fin de la série météo souhaitée
#' @param parametre valeur possible rr,glot,tn,tx,tm,etp,vt. il est possible de demander plusieurs paramètre en les séparant avec un | exemple : rr|glot|tm renverra pluie, rayonnement et température moyenn
#' @param frequence  indique la fréquence de sortie : H : données horaires, Q : données quotidienne
#'
#' @return Renvoi une série de donnée sous forme CNA
#' @export
#'
#' @examples
ws_station_meteo <- function(credential,id_station,start_date,end_date,parametre,frequence){
  url<-paste('https://smartis.re/api/GET_STATION_DATA_CIRAD?freq=',frequence,'&idstation=',id_station,'&startdate=',start_date,'&enddate=',end_date,'&params=',parametre,'&format=json',sep="")
  return(.ws_response(credential,url))
}


#' Fonction de récupération de l'altitude en un point situé à (longitude,latitude) coordonnées en WGS84, EPSG:4326
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude de lieu ou la série est souhaitée en ° décimaux ou en m EPSG:32740
#' @param longitude longitude de lieu ou la série est souhaitée en ° décimaux ou en m EPSG:32740
#' @param unite Unité des coordonnées passé en paramètre 'dd' pour ° décimaux (EPSG:4326) ou 'm' pour mètre EPSG:32740
#' @return Renvoi la valeur de l'altitude à la position demandée si cette position est sur La Réunion sinon renvoi NULL
#' @export
#'
#' @examples https://smartis.re/api/WSALTI?lat=-21.33253&long=55.56128&unit=dd&format=json
#'
ws_alti <- function(credential,latitude,longitude,unite){
  url<-paste('https://smartis.re/api/WSALTI?lat=',latitude,'&long=',longitude,'&unit=',unite,'&format=json',sep="")
  return(.ws_response(credential,url))
}




#' Fonction de récupération de la réserve utile en un point situé à (longitude,latitude) coordonnées exprimées dans le système WGS84, EPSG:4326
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param longitude longitude de lieu ou la série est souhaitée en ° décimaux
#'
#' @return Renvoi la valeur de la réserve utile à la position demandé.
#' @export
#'
#' @examples
ws_ru <- function(credential,latitude,longitude){
  url<-paste('https://smartis.re/api/WSRU?lat=',latitude,'&long=',longitude,'&format=json',sep="")
  return(.ws_response(credential,url))
}



#' Fonction de récupération de l'altitude à partir du MNT Litto-3d en un point situé à (longitude,latitude) coordonnées exprimées dans le système WGS84, EPSG:4326
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param longitude longitude de lieu ou la série est souhaitée en ° décimaux
#'
#' @return Renvoi la valeur de l'altitude à la position demandé.
#' @export
#'
#' @examples
ws_alti_dd <- function(credential,latitude,longitude){
  url<-paste('https://smartis.re/api/WSALTI?lat=',latitude,'&long=',longitude,'&unit=dd&format=json',sep="")
  return(.ws_response(credential,url))
}



#' Fonction de récupération de l'altitude à partir du MNT Litto-3d en un point situé à (longitude,latitude), coordonnées exprimées dans le système WGS84 - UTM 40S.
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude de lieu ou la série est souhaitée en mètre
#' @param longitude longitude de lieu ou la série est souhaitée en mètre
#'
#' @return Renvoi la valeur de l'altitude à la position demandé.
#' @export
#'
#' @examples
ws_alti_m <- function(credential,latitude,longitude){
  url<-paste('https://smartis.re/api/WSALTI?lat=',latitude,'&long=',longitude,'&unit=m&format=json',sep="")
  return(.ws_response(credential,url))
}





#' Fonction de collecte de donnees meteo du projet BRIO pour l'etude du changement climatique à La Réunion
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param longitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param start_date Date de début de la série météo souhaitée. Les dates sont valides entre 2015 et 2100
#' @param end_date Date de fin de la série météo souhaitée. Les dates sont valides entre 2015 et 2100 et end_date>start_date
#' @param scenario indique le code scénario de changement climatique souhaité (code possible ssp126, ssp245, ssp585. Voir fonction choix_scenario()
#'
#' @return Renvoi une série de donnée obtenu par un générateur de climat en suivant le scénario choisi
#' @export
#'
#' @examples
ws_brio_data <- function(credential,latitude,longitude,start_date,end_date,scenario){
  url<-paste('https://smartis.re/api/GET_CLIMATE_CHANGE_DATA?long=',longitude,'&lat=',latitude,'&startdate=',start_date,'&enddate=',end_date,'&scenario=',scenario,'&format=json',sep="")
  return(.ws_response(credential,url))
}



#' Fonction de collecte de donnees meteo référence ERA5 corrigé du biais par AROME (2.5 km); interpollé sur une grille de 3x3 km
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param longitude latitude de lieu ou la série est souhaitée en ° décimaux
#' @param start_date Date de début de la série météo souhaitée. Les dates sont valides entre 1981 et 2100 selon le scénario souhaité.
#' @param end_date Date de fin de la série météo souhaitée. Les dates sont valides entre 1981 et 2100 et end_date>start_date
#' @param scenario Code du scénario souhaité. Le code peut être obtenu en appelant la fonction code_scenario('val'), avec val ayant pour valeur possible: ('ssp126','ssp245','ssp585','hist','ref')
#'
#' @return Renvoi une série de donnees meteo de référence ERA5 corrigée du biais par AROME (2.5 km); interpollé sur une grille de 3x3 km. Les données sont disponibles entre 1981 et 2100.
#' @export
#'
#' @examples
ws_data_grid <- function(credential,latitude,longitude,start_date,end_date,scenario){
  if (missing(scenario)){
    code_scen<-'0'
  }else{
    code_scen<-scenario
  }
  url<-paste('https://smartis.re/api/GET_CLIMATE_GRID?long=',longitude,'&lat=',latitude,'&startdate=',start_date,'&enddate=',end_date,'&scenario=',code_scen,'&format=json',sep="")
  return(.ws_response(credential,url))
}

#' Fonction de récupération d'une analyse fréquentielle journalière à une position données.
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude du lieu ou la série est souhaitée en ° décimaux
#' @param longitude longitude du lieu ou la série est souhaitée en ° décimaux
#' @param altitude indique l'altitude du lieu souhaité en m par rapport au niveau de la mer en m
#' @param start_date Date de début de la série météo souhaitée. Les dates sont valides avant la date courante.
#' @param end_date Date de fin de la série météo souhaitée. Les dates sont valides avant la date courante.
#'
#' @return Renvoi une analyse fréquentielle en année médiane des données pluie, température, évapotranspiration, rayonnement pour chaque jour de l'année.
#' @export
#'
#' @examples
ws_meteo_frequency <- function(credential,latitude,longitude,altitude,start_date,end_date){
  url<-paste('https://smartis.re/api/WSMeteoFrequencyAnalysis?long=',longitude,'&lat=',latitude,'&alt=',altitude,'&startdate=',start_date,'&enddate=',end_date,'&format=json',sep="")
  return(.ws_response(credential,url))
}


#' Fonction d'appel au modèle de croissance de la canne à sucre MOSICAS
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude du lieu ou la simulation est souhaitée en ° décimaux
#' @param longitude longitude du lieu ou la simulation est souhaitée en ° décimaux
#' @param start_date Date de début de la simulation souhaitée. Les dates sont valides entre 01/01/2002 et end_date - 1
#' @param end_date Date de fin de la simulation souhaitée. Les dates sont valides entre 01/01/2002 et jour courant - 1
#' @param remplissage Taux de remplissage de la réserve utile en %
#' @param p0 p-Factor fixé par défaut à 0.5 qui décrit la répartition entre la partie de la réserve où l'eau est facile d'accès et l'autre partie ou l'eau est difficile d'accès sans unité
#' @param ru Réserve utile en mm. Voir ws_ru()
#' @param profrac Profondeur d'enracinement en m
#' @param ressurf Réservoir de surface pour en prendre en compte le mulch en mm
#' @param variete Code variete sans unité
#' @param stade Code indiquant la nature => 1 repousse , 0 vierge
#' @param irdose Dose d'irrigation en mm
#' @param freqdose Fréquence ou la dose d'irrigation sera appliquée en JOUR entier
#' @param freq_sortie indique la fréquence ou les valeurs calculés par le modèle seront sortie vers l'écran ou le fichier. Si freq_sortie > durée du cycle, la dernière ligne de valeurs du modèle est sortie
#' @param dose_is_var valeur 1 ou 0; 1 : irrigation en dose variable sera calculé selon max(txRempl x RU x Profondeur - stockfr,0) ; 0 : la dose est fixe et sera fourni dans les deux cas la dose est appliquée à fréquence fixe
#' @param tx_remplissage valeur compris entre 1 et 100 et exprime en pourcentage le niveau de remplissage à atteindre par irrigation si la dose variable est choisi
#' @return Retourne l'ensemble des variables calculées par le modèle MOSICAS (météo, bilan hydrique, croissance de la plante en cm, rendement) variable yldcan en t/ha
#' @export
#'
#' @examples
ws_mosicas <- function(credential,latitude,longitude,start_date,end_date,remplissage,p0,ru,profrac,ressurf,variete,stade,irdose,freqdose,freq_sortie,dose_is_var,tx_remplissage){
  if (missing(dose_is_var)){
    dose_is_var <- '0'
  }
  if (missing(tx_remplissage)){
    tx_remplissage<-'0'
    dose_is_var <- '0'
  }
  url<-paste('https://smartis.re/api/WSMosicas?lat=',latitude,'&long=',longitude,'&startdate=',start_date,'&enddate=',end_date,'&remplissage=',remplissage,'&p0=',p0,'&ru=',ru,'&profrac=',profrac,'&ressurf=',ressurf,'&variete=',variete,'&stade=',stade,'&irdose=',irdose,'&freqdose=',freqdose,'&freq=',freq_sortie,'&isFixe=',dose_is_var,'&txRempl=',tx_remplissage,'&format=json',sep="")
  return(.ws_response(credential,url))
}

#' Fonction d'appel au modèle de croissance de la canne à sucre MOSICAS sur Grid 3x3 km
#'
#' @param credential obtenu par appel de la fonction get_credential
#' @param latitude latitude du lieu ou la simulation est souhaitée en ° décimaux
#' @param longitude longitude du lieu ou la simulation est souhaitée en ° décimaux
#' @param start_date Date de début de la simulation souhaitée. Les dates sont valides entre 01/01/2002 et end_date - 1
#' @param end_date Date de fin de la simulation souhaitée. Les dates sont valides entre 01/01/2002 et jour courant - 1
#' @param remplissage Taux de remplissage de la réserve utile en %
#' @param p0 p-Factor fixé par défaut à 0.5 qui décrit la répartition entre la partie de la réserve où l'eau est facile d'accès et l'autre partie ou l'eau est difficile d'accès sans unité
#' @param ru Réserve utile en mm. Voir ws_ru()
#' @param profrac Profondeur d'enracinement en m
#' @param ressurf Réservoir de surface pour en prendre en compte le mulch en mm
#' @param variete Code variete sans unité
#' @param stade Code indiquant la nature => 1 repousse , 0 vierge
#' @param irdose Dose d'irrigation en mm
#' @param freqdose Fréquence ou la dose d'irrigation sera appliquée en JOUR entier
#' @param freq_sortie indique la fréquence ou les valeurs calculés par le modèle seront sortie vers l'écran ou le fichier. Si freq_sortie > durée du cycle, la dernière ligne de valeurs du modèle est sortie
#' @param dose_is_var valeur 1 ou 0; 1 : irrigation en dose variable sera calculé selon max(txRempl x RU x Profondeur - stockfr,0) ; 0 : la dose est fixe et sera fourni dans les deux cas la dose est appliquée à fréquence fixe
#' @param tx_remplissage valeur compris entre 1 et 100 et exprime en pourcentage le niveau de remplissage à atteindre par irrigation.
#' @return Retourne l'ensemble des variables calculées par le modèle MOSICAS sur le grid de 3x3 km (météo, bilan hydrique, croissance de la plante en cm, rendement) variable yldcan en t/ha
#' @export
#'
#' @examples
ws_mosicas_grid <- function(credential,latitude,longitude,start_date,end_date,remplissage,p0,ru,profrac,ressurf,variete,stade,irdose,freqdose,freq_sortie,dose_is_var,tx_remplissage,scenario){
  if (missing(scenario)){
    code_scen<-'0'
  }else{
    code_scen<-scenario
  }
  url<-paste('https://smartis.re/api/WSMosicas?lat=',latitude,'&long=',longitude,'&startdate=',start_date,'&enddate=',end_date,'&remplissage=',remplissage,'&p0=',p0,'&ru=',ru,'&profrac=',profrac,'&ressurf=',ressurf,'&variete=',variete,'&stade=',stade,'&irdose=',irdose,'&freqdose=',freqdose,'&freq=',freq_sortie,'&isFixe=',dose_is_var,'&txRempl=',tx_remplissage,'&scenario=',code_scen,'&grid=1&format=json',sep="")
  return(.ws_response(credential,url))
}

#' Renvoi la description du scénario correspondant au code (ssp126, ssp245, ssp585, hist, ref)
#'
#' @param code_scenario code scénario possible ssp126, ssp245, ssp585, hist, ref
#'
#' @return Description détaillé du scénario indiqué par le code.
#' @export
#'
#' @examples choix_scenario('ssp126')
choix_scenario<-function(code_scenario){
  return(switch(code_scenario,
                'ssp126' = 'SSP 1 avec réchauffement limité à 2°C. Le scénario SSP1 (faible défi d’adaptation, faible défi d’atténuation), décrit un monde marqué par une forte coopération internationale, donnant la priorité au développement durable',
                'ssp245' = 'SSP 2 avec réchauffement limité à 3°C. Le scénario SSP2 (défi d’adaptation moyen, défi d’atténuation moyen), décrit un monde caractérisé par la poursuite des tendances actuelles',
                'ssp585' = 'SSP 5 avec réchauffement atteignant les 6°C. Le scénario SSP5 (faible défi d’adaptation, défi d’atténuation élevé) décrit un monde qui se concentre sur un développement traditionnel et rapide des pays en voie de développement, fondé sur une forte consommation d’énergie et des technologies émettrices de carbone; la hausse du niveau de vie permettrait d’augmenter la capacité d’adaptation, notamment grâce au recul de l’extrême pauvreté.',
                'hist'   = 'Données historique de 01/01/1981 - 31/12/2015',
                'ref'    = 'Données de référence entre 2000 et 2019'
  ))
}

#' Renvoi la description du scénario correspondant au code (ssp126, ssp245, ssp585, hist, ref)
#'
#' @param code_scenario code scénario possible ssp126, ssp245, ssp585, hist, ref
#'
#' @return Code sceneario = identifiant du scénario en base de donnée.
#' @export
#'
#' @examples code_scenario('ssp126')
code_scenario<-function(code_scenario){
  return(switch(code_scenario,
                'ssp126' = '1',
                'ssp245' = '2',
                'ssp585' = '3',
                'hist'   = '4',
                'ref'    = '0'
  ))
}




#' Fonction faisant le lien entre le nom d'une variété de canne à sucre et son code de base de données
#'
#' @param code_variete
#'
#' @return renvoi le code correspondant à la variété dans la base de données SmartIS
#' @export
#'
#' @examples choix_variete('R577')
choix_variete<-function(code_variete){
  return(switch(code_variete,
                'B 5992'= 1,
                'B 69379'= 2,
                'B 69566'= 3,
                'B 8008'= 4,
                'B 80689'= 5,
                'B 82139'= 6,
                'B 47528'= 7,
                'B 51129'= 8,
                'CO 6415'= 9,
                'R570'= 10,
                'R579'= 11,
                'R580'= 12,
                'R581'= 13,
                'R582'= 14,
                'R583'= 15,
                'NCO 376'= 18,
                'Mex 68/200'= 19,
                'R577'= 20,
                'R92 804'= 21,
                'R585'= 22,
                'R586' = 23))
}


#' Fonction permettant de déterminer le numéro de décade (décade météo) depuis une date
#'
#' @param dat
#'
#' @return renvoi le numéro de la décade météorologique
#' @export
#'
#' @examples decade('03/04/2023')
decade <- function(dat){
  dayNum <- strtoi(format(dat,'%d'), base=10)
  monthNum <- strtoi(format(dat,'%m'), base=10)
  numDec <- abs(trunc((dayNum-1)/10))+1;
  if (numDec>3) {
    numDec <-3
  }
  return((monthNum-1)*3+numDec)
}


#' Fonction de synthèse des données météorologiques (pluies et températures moyennes)
#'
#' Cette Fonction permet de faire une synthèse des pluies et des températures moyennes par mois ou par décade en calculant la moyenne inter annuelle des pluies et la moyenne des température par mois ou par décade.
#' Cette fonction nécessite le package 'dplyr'.
#'
#' @param credential Obtenu par l'appel de la fonction get_credential('login','password')
#' @param idstation Identifiant de la station météo. Vous devez disposer d'un compte qui vous autorise l'accès des données en pied de station.
#' @param date_deb Date de début de la série de donnée.
#' @param dat_fin Date de fin de la série de donnée, la date de fin doit être supérieure à la date de début.
#' @param frequence Argument optionnel, par défaut la fréquence renvoyée est le mois. Valeur possible : 'decade' ou 'mois'
#' @return Renvoi un data frame contenant la synthèse par mois ou par décade selon la fréquence choisie des pluies et des températures. La pluie renvoyée est la moyenne inter-annuelle des cumuls de pluie par décade ou par mois. La température est la moyenne des températures de tous les années et mois présent dans la série.
#' @export
#'
#' @examples synthese_data_mto(credential,"97416465","01/01/2012","31/12/2022")
#' @examples synthese_data_mto(credential,"97416465","01/01/2012","31/12/2022",'decade')
#' #' @examples synthese_data_mto(credential,"97416465","01/01/2012","31/12/2022",'mois')
synthese_data_mto <- function(credential,idstation,date_deb,date_fin,frequence){
  if (!requireNamespace("dplyr", quietly = TRUE)) {
    print('Le paquet dplyr est requis pour cette fonction, Installation...')
    install.packages('dplyr')
    require(dplyr)
  }
  if( ! ("dplyr" %in% (.packages()))) {
    library(dplyr)
  }

  if (missing(frequence)){
    freq<-'mois'
  }else{
    freq<-frequence
  }
  # Récupération des données cumulées par fréquence(décade ou mois) :

  data_mto <- extract_mto_by_freq(credential,idstation,date_deb,date_fin,frequence)

  # Selon la fréquence de sortie:
  if (frequence=='decade'){
    # Calcul de la moyenne inter annuelle des pluies par décade :
    pluie_synth <- data_mto %>%
        filter(!is.na(Pluie_mm) & !is.na(Temperature_C)) %>%
        group_by(Decade) %>%
        summarise(pluie_moy_dec = mean(Pluie_mm),
                  temp_moy_dec = mean(Temperature_C),
                  nb_annee = length(Pluie_mm))
    colnames(pluie_synth) <- c('Decade','Pluie_mm','Temperature_C','Nb_annee')
  }else{
    # Calcul de la moyenne inter annuelle des pluies par décade :
    pluie_synth <- data_mto %>%
      filter(!is.na(Pluie_mm) & !is.na(Temperature_C) ) %>%
      group_by(Mois) %>%
      summarise(pluie_moy_dec = mean(Pluie_mm),
                temp_moy_dec = mean(Temperature_C),
                nb_annee = length(Pluie_mm))
    colnames(pluie_synth) <- c('Mois','Pluie_mm','Temperature_C','Nb_annee')
  }
  return(pluie_synth)
}




#' Fonction d'extraction des données météorologiques (pluies et températures) par décade ou par mois.
#'
#' Cette Fonction permet de calculer le cumul des pluies et des températures moyennes par mois ou par décade.
#' Cette fonction nécessite le package 'dplyr'.
#'
#' @param credential Obtenu par l'appel de la fonction get_credential('login','password')
#' @param idstation Identifiant de la station météo. Vous devez disposer d'un compte qui vous autorise l'accès des données en pied de station.
#' @param date_deb Date de début de la série de donnée.
#' @param dat_fin Date de fin de la série de donnée, la date de fin doit être supérieure à la date de début.
#' @param frequence Argument optionnel, par défaut la fréquence renvoyée est le mois. Valeur possible : 'decade' ou 'mois'
#' @return Renvoi un data frame contenant les données cumulées ou moyennées par mois ou par décade.
#' @export
#'
#' @examples synthese_data_mto(credential,"97416465","01/01/2012","31/12/2022")
#' @examples synthese_data_mto(credential,"97416465","01/01/2012","31/12/2022",'decade')
#' #' @examples synthese_data_mto(credential,"97416465","01/01/2012","31/12/2022",'mois')
extract_mto_by_freq <- function(credential,idstation,date_deb,date_fin,frequence){
  if (!requireNamespace("dplyr", quietly = TRUE)) {
    print('Le paquet dplyr est requis pour cette fonction, Installation...')
    install.packages('dplyr')
    require(dplyr)
  }
  if( ! ("dplyr" %in% (.packages()))) {
    library(dplyr)
  }

  if (missing(frequence)){
    freq<-'mois'
  }else{
    freq<-frequence
  }
  # Récupération des données brutes :
  data_mto <- ws_station_meteo(credential,idstation,date_deb,date_fin,'rr|tm','Q')

  # Conversion de la date chaine en date au format date :
  data_mto$dat<- as.POSIXct(data_mto$Jour, format = "%d-%m-%Y ")
  # Extraction de l'année et du mois de la date :
  data_mto$an<- format(data_mto$dat,'%Y')
  data_mto$mois<-format(data_mto$dat,'%m')
  # Conversion variable chaine en numérique :
  data_mto$pluie <- as.numeric(data_mto$rr)
  data_mto$tempe <- as.numeric(data_mto$tm)
  # Selon la fréquence de sortie:
  if (frequence=='decade'){
    # Calcul du numéro de décade pour chaque date :
    data_mto$dec<-NULL
    for (i in 1:length(data_mto$dat)){
      data_mto$dec[i] <- decade(data_mto$dat[i])
    }
    # Calcul du cumul de pluie par an et par décade :
    pluie_synth <- data_mto %>%
      filter(!is.na(pluie)) %>%
      group_by(an,dec) %>%
      summarise(cumul = sum(pluie))
    # Construction d'une colonne identifiant unique :
    pluie_synth$annee_dec<- paste(pluie_synth$an,pluie_synth$dec,sep='-')
    # Calcul de la température moyenne :
    temp_mean_synth <- data_mto %>%
      filter(!is.na(tempe)) %>%
      group_by(an,dec) %>%
      summarise(temp_moy_dec = mean(tempe))
    # Construction d'une colonne identifiant unique :
    temp_mean_synth$annee_dec<- paste(temp_mean_synth$an,temp_mean_synth$dec,sep='-')

    # Variable de synthese :
    data_synthese <-  merge(pluie_synth,temp_mean_synth,by="annee_dec",all=TRUE)
    data_synth <- data_synthese[,!names(data_synthese) %in% c('annee_dec','an.y','dec.y')]
    colnames(data_synth) <- c('Annee','Decade','Pluie_mm','Temperature_C')
    data_synthese <-data_synth
  }else{
    # Calcul par mois :
    # Calcul du cumul de pluie par an et par décade :
    pluie_synth <- data_mto %>%
      filter(!is.na(pluie)) %>%
      group_by(an,mois) %>%
      summarise(cumul = sum(pluie))

    # Construction d'une colonne identifiant unique :
    pluie_synth$annee_mois<- paste(pluie_synth$an,pluie_synth$mois,sep='-')

    # Calcul de la température moyenne :
    temp_mean_synth <- data_mto %>%
      filter(!is.na(tempe)) %>%
      group_by(an,mois) %>%
      summarise(temp_moy_dec = mean(tempe))
    # Construction d'une colonne identifiant unique :
    temp_mean_synth$annee_mois<- paste(temp_mean_synth$an,temp_mean_synth$mois,sep='-')
    # Fusion des deux jeux de données :
    data_synthese <-  merge(pluie_synth,temp_mean_synth,by="annee_mois",all=TRUE)
    data_synth <- data_synthese[,!names(data_synthese) %in% c('annee_mois','an.y','mois.y')]
    colnames(data_synth) <- c('Annee','Mois','Pluie_mm','Temperature_C')
    data_synthese <- data_synth
  }
  return(data_synthese)
}
