#' @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}} 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,
                                     FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES,
                                     TAUX_MORTALITE,
                                     RR_AVS
                                     ) {
    
    print("Run module: mod_eprc_projection_flex")

  #--- Initalisation----

  RR_0 <- RR_AVS %>%
    filter(!is.na(gpr))

  #---------Traitement et projection des EPRC avec une rente vieillesse----------

  RR_ASSURANCE_VIEILLESSE_EPRC_FLEX_FILTERED <- RR_0 %>%
    filter(jahr == PARAM_GLOBAL$jahr_rr &
      gpr == "rvieillesse_simple", age_ret > 61) %>%
    group_by(jahr, alt, dom, sex, nat, zv, age_ret, gpr) %>%
    summarise(eprc_ref = sum(eprc, na.rm = TRUE)) %>%
    ungroup() %>%
    dplyr::select(-jahr)
  

  EPRC_PROJECTION_FLEX_0_AV <- FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES %>%
    left_join(TAUX_MORTALITE, by = c("sex", "jahr", "alt", "nat")) %>%
    # Right_join pour que seuls les âges du RR soient pris en compte
    right_join(RR_ASSURANCE_VIEILLESSE_EPRC_FLEX_FILTERED,
      by = c("alt", "sex", "nat", "dom")
    ) %>%
    filter(jahr >= PARAM_GLOBAL$jahr_rr & !is.na(eprc)) %>%
    group_by(sex, nat, dom, alt, age_ret, gpr, zv) %>%
    # 1ère étape: projeter les eprc selon leur facteurs de croissance (cf. étape
    # 1 et 2). Nous utilisons ces eprc projetés comme valeur de départ pour
    # l'évolution de la mortalité.

    mutate(
      cumprod_wr = cumprod(wachstumsfaktor),
      eprc1 = cumprod_wr * eprc_ref
    ) %>%
    ungroup() %>% 
    mutate(coh = jahr - alt) %>% 
    filter(!(sex == "f" & coh > 1969 & age_ret == 62)) %>% 
    select(age_ret, sex, nat, dom, gpr, zv, jahr, alt, eprc = eprc1)


  #---------Traitement et projection des EPRC survivants, rentes compl. et
  # rentes pour enfants----

  # Filtrer pour les autres types de rentes
  RR_ASSURANCE_VIEILLESSE_EPRC_FLEX_FILTERED_AS <- RR_0 %>%
    filter(jahr == PARAM_GLOBAL$jahr_rr &
      !(gpr %in% c("rvieillesse_simple", "rcompl_femme"))) %>%
    rename(eprc_ref = eprc) %>%
    dplyr::select(-c(jahr, age_ret))


  EPRC_PROJECTION_FLEX_0_AS <- FACTEURS_CROISSANCE_ANNUELS_EPRC_ESTIMES %>%
    left_join(TAUX_MORTALITE, by = c("sex", "jahr", "alt", "nat")) %>%
    # Right_join pour que seuls les âges du RR soient pris en compte
    right_join(RR_ASSURANCE_VIEILLESSE_EPRC_FLEX_FILTERED_AS,
      by = c("alt", "sex", "nat", "dom")
    ) %>%
    filter(jahr >= PARAM_GLOBAL$jahr_rr &
      !is.na(eprc)) %>%
    group_by(sex, nat, dom, alt, gpr, zv) %>%
    # 1ère étape: Projeter les eprc selon les facteurs de croissance de la
    # population (cf. étape 1 et 2).

    mutate(
      cumprod_wr = cumprod(wachstumsfaktor_popu),
      eprc1 = cumprod_wr * eprc_ref
    ) %>%
    ungroup() %>% 
    select(sex, nat, dom, gpr, zv, jahr, alt, eprc = eprc1)
    
  return(
    list(EPRC_PROJECTION_FLEX = 
           bind_rows(EPRC_PROJECTION_FLEX_0_AV, EPRC_PROJECTION_FLEX_0_AS))
  )
}
