#' Berechnung der AHV-Rentensumme
#'
#' Berechnet die AHV-Rentensumme mit den 5 Schritten gemäss des Modells der EPRC.
#'
#' @param PARAM_GLOBAL un dataframe d'une seule ligne, dont nous utilisons les
#'   paramètres globaux.
#'
#' @param AHV_ABRECHNUNG data frame containing benefits values, see function
#' \code{\link{mod_input_ahv_abrechnung}}.
#'
#' @param BEVOELKERUNG data frame containing the population data \code{\link{mod_population}}.
#'
#' @param MORTALITE data frame containing the mortality rates, see function
#' \code{\link{mod_input_mortalite}}.
#'
#' @param ANT_AJO_FLEX data frame containing the anticipation/ajournement rates,
#' see function \code{\link{mod_input_ant_ajo_flex}}.
#'
#' @param RR_AVS data frame containing the data coming from the rents register,
#' see function \code{\link{mod_input_rr_avs_dataframe}} and
#' create_rr_avs (dinput).
#'
#' @param CUMPROD_PARAM_ERSTRENTE data frame containing the correction factors,
#' for the level of the first rents, see function
#' \code{\link{mod_scenario_erstrenten}}.
#'
#' @param RENTENENTWICKLUNG data frame containing the projected growth
#'   factor for the minimal benefits, see function
#'   \code{\link{mod_rentenentwicklung}}.
#'
#'
#' @references \href{https://www.bsv.admin.ch/dam/bsv/fr/dokumente/ahv/finanzperspektiven/validierung-modellansatz-ahv.pdf.download.pdf/2018_07_09_definitif_ld_rapport_ofas.pdf}{Rapport de Prof. Dr Laurent Donzé}
#'
#' @return a `tidylist` containing the following tidy data frames:
#'  - `AHV_RENTENSUMME`
#'  - `EPRC_ESTIMATION`
#'  - `FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES`
#'  - `EPRC_PROJECTION_FLEX`
#'  - `FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX`
#'  - `FACTEUR_CORR_ANT_AJO`
#'  - `ANT_TOTAL`
#'  - `AJO_TOTAL`
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export


mod_ahv_rentensumme <- function(PARAM_GLOBAL,
                                AHV_ABRECHNUNG,
                                BEVOELKERUNG,
                                RENTENENTWICKLUNG,
                                TAUX_MORTALITE,
                                ANT_AJO_FLEX,
                                RR_AVS,
                                CUMPROD_PARAM_ERSTRENTE
                                ) {
    
    print("Run module: mod_ahv_rentensumme")
    
  PARAM_GLOBAL_EPRC <- PARAM_GLOBAL
  
  # Etape 1 : Estimation des EPRC
  EPRC_ESTIMATION <-
    mod_eprc_estimation(
      PARAM_GLOBAL   = PARAM_GLOBAL_EPRC,
      BEVOELKERUNG   = BEVOELKERUNG,
      TAUX_MORTALITE = TAUX_MORTALITE,
      RR_AVS         = RR_AVS
    )

  # Etape 2: Calcul des facteurs de croissance des EPRC annuels pour chaque âge

  FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES <-
    mod_facteurs_croissance_annuels_eprc_estimes(
      PARAM_GLOBAL = PARAM_GLOBAL_EPRC,
      EPRC_ESTIMATION = EPRC_ESTIMATION
    )


  # Etape 3: projection des EPRC à partir du registre

  EPRC_PROJECTION_FLEX <-
    mod_eprc_projection_flex(
      PARAM_GLOBAL = PARAM_GLOBAL_EPRC,
      FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES = FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES,
      TAUX_MORTALITE = TAUX_MORTALITE,
      RR_AVS = RR_AVS
    )$EPRC_PROJECTION_FLEX


  # Etape 4: Calcul des facteurs de croissance des EPRC par année

  FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX <-
    mod_facteurs_crois_eprc_proj_flex(
      EPRC_PROJECTION_FLEX = EPRC_PROJECTION_FLEX
    )$FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX

  # Etape 5: Projection, dynamisation et ajustement des sommes de rentes au
  #          budget du jahr_abr selon le droit en vigueur


  # Sommes des rentes par année

  tl <- mod_ahv_rentensumme_go(
    PARAM_GLOBAL = PARAM_GLOBAL,
    FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX = FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX,
    AHV_ABRECHNUNG = AHV_ABRECHNUNG,
    RENTENENTWICKLUNG = RENTENENTWICKLUNG,
    RR_AVS = RR_AVS,
    CUMPROD_PARAM_ERSTRENTE = CUMPROD_PARAM_ERSTRENTE
  )

  AHV_RENTENSUMME_GO_OLD <- tl$RENTENSUMME_AHV_GO %>%
    dplyr::select(jahr, rentensumme) %>%
    rename(rent_tot = rentensumme)

  AHV_RENTENSUMME_PARAGESEXDOMNAT <- tl$RENTENSUMME_AHV_GO_PARAGESEXDOMNAT
  AHV_RENTENSUMME <- AHV_RENTENSUMME_GO_OLD


  # ---Annexe: préparation pour le traitement des mesures dans
  # wrap_ahv_massnahmen.R. Calcul des facteurs de correction des taux
  # d'anticipation et d'ajournement

  tl_mod_facteur_corr_ant_ajo <- mod_facteur_corr_ant_ajo_go(
    PARAM_GLOBAL = PARAM_GLOBAL,
    FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX = FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX,
    ANT_AJO_FLEX = ANT_AJO_FLEX
  )

  FACTEUR_CORR_ANT_AJO <- tl_mod_facteur_corr_ant_ajo$FACTEUR_CORR_ANT_AJO

  ANT_TOTAL <- tl_mod_facteur_corr_ant_ajo$ANT_TOTAL

  AJO_TOTAL <- tl_mod_facteur_corr_ant_ajo$AJO_TOTAL

  # --- Output -----------------------------------------------------------------

        return(list(
            AHV_RENTENSUMME = AHV_RENTENSUMME,
            AHV_RENTENSUMME_GO_OLD = AHV_RENTENSUMME_GO_OLD,
            EPRC_ESTIMATION = EPRC_ESTIMATION,
            AHV_RENTENSUMME_PARAGESEXDOMNAT = AHV_RENTENSUMME_PARAGESEXDOMNAT,
            FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES = FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES,
            EPRC_PROJECTION_FLEX = EPRC_PROJECTION_FLEX,
            FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX = FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX,
            FACTEUR_CORR_ANT_AJO = FACTEUR_CORR_ANT_AJO,
            ANT_TOTAL = ANT_TOTAL,
            AJO_TOTAL = AJO_TOTAL
        ))

}
