#' @title Projection des EPRC à partir du RR filtré pour la population
#' suisse résidante (avec les retraites anticipées)
#'
#' @description Ce module projette les EPRC à partir du registre des rentes de
#' jahr_abr (avec les retraites anticipées) à l'aide des facteurs de croissance
#' calculés par âge et par année FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES.
#'
#' @param PARAM_GLOBAL un dataframe d'une seule ligne, dont nous utilisons les
#'   paramètres suivants:
#'   - `jahr_rr`: Année du registre des rentes analysé
#'
#' @param MORTALITE data frame contenant les taux de mortalité, cf. fonction
#' \code{\link{mod_input_mortalite}}.
#'
#' @param FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES data frame contenant les
#' facteurs de croissance calculés à la 2ème étape dans la fonction
#' \code{\link{mod_facteurs_croissance_annuels_eprc_estimes}} grâce aux EPRC
#' calculés à la première étape (EPRC_ESTIMATION de
#' \code{\link{mod_eprc_estimation}}).
#'
#' @param RR_AVS data frame contenant les données du registre des rentes de la
#' jahr_abr, cf. fonctions \code{\link{mod_input_rr_avs_dataframe_agecon}} and
#' create_rr_avs (dinput).
#'
#' @param list `tidylist`. Elément obligatoire dans tous les modules. Au lieu de
#'   fournir des dataframes au module, il est possible de l'alimenter uniquement
#'   avec une`tidylist` qui contient les tidy dataframes. Tous les datframes
#'   listés doivent être présents dans la tidylist, avec le même nom. De plus,
#'   la `tidylist` peut aussi contenir des dataframes qui ne sont pas utilisés
#'   par le module.
#'
#' @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 une `tidylist` contenant le data frame suivant:
#' - EPRC_PROJECTION_FLEX
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export
#'

mod_eprc_projection_flex <- function(PARAM_GLOBAL,
                                     WF_EPRC_ALG,
                                     RR_AVS) {
  
  print("Run module: mod_eprc_projection_flex")
  
  # Altersrenten. ------------------------------------------------------------------------
  
  RR_AV <- RR_AVS %>%
    filter(jahr == PARAM_GLOBAL$jahr_rr, gpr == "rvieillesse") %>%
    dplyr::summarize(eprc_ref = sum(eprc, na.rm = TRUE),
              .by = c("sex", "nat", "dom", "gpr", "alt"))
  
  PROJ_AV <- WF_EPRC %>%
    # Right_join pour que seuls les âges du RR soient pris en compte
    right_join(RR_AV, 
               by = c("sex", "nat", "dom", "alt"), relationship = "many-to-many") %>%
    filter(jahr >= PARAM_GLOBAL$jahr_rr) %>%
    group_by(sex, nat, dom, gpr, alt) %>%
    arrange(jahr, .by_group = TRUE) %>% 
    mutate(eprc = cumprod(wachstumsfaktor) * eprc_ref,
           coh  = jahr - alt) %>%
    select (coh, sex, nat, dom, gpr, jahr, alt, eprc) %>% 
    arrange(coh, sex, nat, dom, gpr, jahr, alt)
  
  # Restliche Rententypen. ---------------------------------------------------------------

  RR_AS <- RR_AVS %>%
    filter(jahr == PARAM_GLOBAL$jahr_rr, gpr != "rvieillesse") %>%
    dplyr::summarize(eprc_ref = sum(eprc),
                     .by = c("sex", "nat", "dom", "gpr", "alt"))

  PROJ_AS <- WF_EPRC_ALG %>%
    select(sex, nat, dom, jahr, alt, wachstumsfaktor_popu) %>% 
    right_join(RR_AS, 
               by = c("sex", "nat", "dom", "alt"), relationship = "many-to-many") %>%
    filter(jahr >= PARAM_GLOBAL$jahr_rr) %>%
    group_by(sex, nat, dom, gpr, alt) %>%
    arrange(jahr, .by_group = TRUE) %>% 
    # 1ère étape: Projeter les eprc selon les facteurs de croissance de la
    # population (cf. étape 1 et 2).
    mutate(eprc = eprc_ref * cumprod(wachstumsfaktor_popu)) %>%
    ungroup() %>% 
    # select(sex, nat, dom, zv, gpr, jahr, alt, eprc = bez_av) %>% 
    dplyr::summarize(eprc = sum(eprc),
                     .by = c("sex", "nat", "dom", "gpr", "jahr", "alt"))
    
  # Übersetzung in Wachstumsraten. -------------------------------------------------------
  
  WF_EPRC_RR <- bind_rows(PROJ_AV, PROJ_AS) %>%
    group_by(sex, nat, dom, gpr, alt) %>%
    arrange(jahr, .by_group = TRUE) %>%
    mutate(
      wf_eprc_rr = ifelse(jahr == PARAM_GLOBAL$jahr_rr, 1, eprc / lag(eprc)),
      wf_eprc_rr = ifelse(is.infinite(wf_eprc_rr), 1, wf_eprc_rr)) %>%
    ungroup() %>% 
    select(sex, nat, dom, gpr, jahr, alt, eprc, wf_eprc_rr)
  
  return(WF_EPRC_RR)
}