#' @title Calcul des facteurs de correction des rentes en cas de réforme
#'
#' @description Ce module estime les facteurs de correction des rentes en cas
#' de réforme. Ces facteurs sont unitaires dans ce module puisque seul le budget
#'  selon le droit en vigueur y est calculé. Une version modifiée de ce module
#'  se trouve dans \code{\link{wrap_ahv_massnahmen}} et sert à corriger les
#'  rentes en fonction de nouveau taux d'anticipation et d'ajournement en plus
#'  d'un changement de l'âge de la retraite.
#'
#' @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.
#'
#' @param PARAM_GLOBAL un dataframe d'une seule ligne, dont nous utilisons les
#'   paramètres suivants:
#'   - `jahr_rr`: année de l'évaluation du RR
#'   - `jahr_ende`: dernière année de la prévision
#'   - `ra_m`:âge de la retraite des hommes
#'   - `ra_f_2005`: âge légal de la retraite des femmes depuis 2005. Si
#'   ra_f_2005 + 1, il s'agit de l'âge égal de la retraite des femmes en cas
#'   d'acceptation de la réforme.
#'   - `max_annees_ajo`: nombre d'années maximal qu'il est possible d'ajourner
#'
#' @param FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX data frame contenant les
#' facteurs de croissances des EPRC projetés à l'étape 3 dans la fonction
#' \code{\link{mod_eprc_projection_flex}}.
#'
#' @param ANT_AJO_FLEX data frame contenant les taux d'anticipation et
#' d'ajournement selon le droit en vigueur et selon d'autres scénarios de
#' réforme, cf. fonction \code{\link{mod_input_ant_ajo_flex}}.
#'
#' @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:
#' - FACTEUR_CORR_ANT_AJO
#' - ANT_TOTAL
#' - AJO_TOTAL
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export
#'

mod_facteur_corr_ant_ajo_go <- function(PARAM_GLOBAL,
                                        FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX,
                                        ANT_AJO_FLEX
                                        ) {
    
    print("Run module: mod_facteur_corr_ant_ajo_go")


  ANT_AJO_EXT <- ANT_AJO_FLEX %>%
    # Choisir le scénario voulu
    filter(jahr == PARAM_GLOBAL$jahr_rr &
      # Fixer le paramètre à geltende_ordnung puique seul le droit en vigueur est
      # désiré ici.
      scenario_reforme == "geltende_ordnung") %>%
    dplyr::select(jahr, sex, age_ret, taux_ant_ajo) %>%
    rename(taux_ant_ajo_ref = taux_ant_ajo) %>%
    dplyr::select(-jahr) %>%
    # Fixer le paramètre à geltende_ordnung puique seul le droit en vigueur est
    # désiré ici.
    right_join(filter(
      ANT_AJO_FLEX,
      scenario_reforme == "geltende_ordnung"
    ),
    by = c("sex", "age_ret")
    )

  # Calcul du nombre d'EPRC MASCULINS qui sont comptabilisés comme ayant anticipé d'un an au moins
  ANT_TOTAL <- FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX %>%
    filter(gpr == "rvieillesse_simple") %>%
    filter(jahr == PARAM_GLOBAL$jahr_rr &
      sex == "m" &
      # a pris sa retraite en 2016
      jahr - (alt - age_ret) == PARAM_GLOBAL$jahr_rr &
      age_ret < PARAM_GLOBAL$ra_m) %>%
    group_by(nat, dom, zv, gpr) %>%
    # Hypothèse: le nombre d'EPRC qui prendrait leur retraite anticipée durant l'année supplémentaire
    # accordée par la réforme (3 ans d'anticipation) est égal au tiers du nombre total d'EPRC anticipés
    summarise(eprc = sum(eprc, na.rm = TRUE) / 3) %>%
    distinct(eprc, nat, dom, zv, gpr) %>%
    mutate(sex = "m", jahr = PARAM_GLOBAL$jahr_rr) %>%
    ungroup()

  # Ajout d'années d'anticipation aux hommes

  FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX_EXT0 <-
    FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX %>%
    filter(gpr == "rvieillesse_simple") %>%
    bind_rows(crossing(dplyr::select(ANT_TOTAL, nat, dom, sex, zv, gpr, eprc),
      jahr = PARAM_GLOBAL$jahr_rr:PARAM_GLOBAL$jahr_ende,
      alt = (PARAM_GLOBAL$ra_m - 3):99,
      age_ret = PARAM_GLOBAL$ra_m - 3,
      # Hypothèse: le nombre d'EPRC qui prennent 3 ans d'anticipation reste
      # constant d'année en année pour tout âge
      wachstumsfaktor = 1
    ))



  #### Femmes
  # Calcul du nombre d'EPRC qui sont comptabilisés comme ayant ajourné d'un an au moins
  AJO_TOTAL <- FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX %>%
    filter(gpr == "rvieillesse_simple") %>%
    filter(jahr == PARAM_GLOBAL$jahr_rr &
      sex == "f" &
      # a pris sa retraite en 2016
      jahr - (alt - age_ret) == PARAM_GLOBAL$jahr_rr &
      # a anticipé sa retraite d'un an au moins
      age_ret > PARAM_GLOBAL$ra_f_2005) %>%
    group_by(nat, dom, zv, gpr) %>%
    # Hypothèse: le nombre d'EPRC FEMININS qui prendrait leur retraite ajournée durant l'année supplémentaire
    # accordée par la réforme (à 70 ans) est égal au cinquième du nombre total d'EPRC anticipés
    summarise(eprc = sum(eprc, na.rm = TRUE) / PARAM_GLOBAL$max_annees_ajo) %>%
    distinct(eprc, nat, dom, zv, gpr) %>%
    mutate(sex = "f", jahr = PARAM_GLOBAL$jahr_rr) %>%
    ungroup()

  # Prise en compte de la 70ème année de prise de retraite possible pour les femmes

  FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX_EXT <-
    FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX_EXT0 %>%
    filter(gpr == "rvieillesse_simple") %>%
    bind_rows(crossing(dplyr::select(AJO_TOTAL, nat, dom, sex, zv, gpr, eprc),
      jahr = PARAM_GLOBAL$jahr_rr:PARAM_GLOBAL$jahr_ende,
      alt = (PARAM_GLOBAL$ra_f_2005 + 1 + PARAM_GLOBAL$max_annees_ajo):99,
      age_ret = PARAM_GLOBAL$ra_f_2005 + 1 + PARAM_GLOBAL$max_annees_ajo,
      # Hypothèse: le nombre d'EPRC qui prennent leur retraite à 70 ans reste
      # constant d'année en année pour tout âge
      wachstumsfaktor = 1
    ))


  # Calcul des facteurs de correction

  FACTEUR_CORR_ANT_AJO <- FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX_EXT %>%
    left_join(ANT_AJO_EXT, by = c("jahr", "sex", "age_ret")) %>%
    mutate(
      annee_retraite = jahr - (alt - age_ret),
      annee_naissance = jahr - alt,
      facteur_corr_taux_flex = if_else(!is.na(taux_ant_ajo_ref), 1, 0)
    ) %>%
    dplyr::select(jahr, sex, nat, dom, alt, age_ret, zv, gpr, eprc, taux_ant_ajo, taux_ant_ajo_ref, facteur_corr_taux_flex, wachstumsfaktor) %>%
    ungroup()



  # Ajout des autres types de rentes où un facteur de correction a été artificiellement ajouté
  FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX_ELSE <- FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX %>%
    filter(gpr != "rvieillesse_simple") %>%
    mutate(
      taux_ant_ajo = NA_real_,
      taux_ant_ajo_ref = NA_real_,
      facteur_corr_taux_flex = 1
    ) %>%
    ungroup()

  FACTEUR_CORR_ANT_AJO <- FACTEUR_CORR_ANT_AJO %>%
    bind_rows(FACTEURS_CROISSANCE_EPRC_PROJETES_FLEX_ELSE)

  return(list(
      FACTEUR_CORR_ANT_AJO = FACTEUR_CORR_ANT_AJO,
      ANT_TOTAL = ANT_TOTAL,
      AJO_TOTAL = AJO_TOTAL
  ))
}
