#' @title Wrapper pour les calculs préparatifs
#'
#' @description Dieser Wrapper bündelt die vorbereitenden Berechnungen aller
#' Versicherungszweige, insbesondere die Abrechnungen, die Bevoelkerungsdaten,
#' die wirtschaftlichen Eckwerte, die Einkommensentwicklung, die Entwicklung der
#' Renten und den Diskontfaktor. Infolge der Annahme der STAF wurde der Bundes-
#' anteil, der Beitragssatz sowie das Demografieprozent vektorisiert. Im Zuge
#' der Covid-19 Pandemie wurde für den Zins und die übrigen Einnahmen Schock-
#' szenarien eingebaut.
#'
#' @param tl_inp List of input data frames.
#'
#' @return a `tidylist` containing the following tidylists:
#' - `tl_abrechnung`
#' - `BEVOELKERUNG`
#' - `tl_eckwerte`
#' - `EINK_ENTWICKLUNG`
#' - `tl_rentenentwicklung`
#' - `ZINS`
#' - `tl_scenario_erstrente`
#' - `DISKONTFAKTOR`
#' - `tl_beitragssatz_vekt`
#' - `IV_SCHULD`
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export

wrap_vorb_berechn <- function(tl_inp) {

    print("Run module: wrap_vorb_berechn")

  # Abrechnung
  tl_abrechnung <- mod_abrechnung(
      tl_inp,
      versicherung=c("ahv")
  )

  tl_inp$BEV_SCENARIO <- tl_inp$BEV_SCENARIO %>%
    filter(scenario == tl_inp$PARAM_GLOBAL$bev_scenario)

  # Mortalite
  tl_mortalite <- mod_mortalite(
        PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
        BEV_BESTAND = tl_inp$BEV_BESTAND,
        BEV_SCENARIO = tl_inp$BEV_SCENARIO
    )

  TAUX_MORTALITE <- tl_mortalite$TAUX_MORTALITE
  TAUX_MORTALITE_TOT <- tl_mortalite$TAUX_MORTALITE_TOT

  # Bevoelkerung
  BEVOELKERUNG <- mod_population(
        PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
        BEV_BESTAND = tl_inp$BEV_BESTAND,
        BEV_SCENARIO = tl_inp$BEV_SCENARIO
    )

  # Berechnung Eckwerte
  tl_eckwerte <- mod_eckwerte(
      PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
      ECKWERTE = tl_inp$ECKWERTE,
      LOHNINDEX = tl_inp$LOHNINDEX,
      PREISINDEX = tl_inp$PREISINDEX
  )

  # Berechnung Diskontfaktor

  DISKONTFAKTOR <- mod_diskontfaktor(
      PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
      ECKWERTE_EXTENDED = tl_eckwerte$ECKWERTE_EXTENDED
  )


  # Berechnung Rentenentwicklung gemaess Rentenanpassungen

  RENTENENTWICKLUNG <- mod_rentenentwicklung(
      PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
      ECKWERTE_EXTENDED = tl_eckwerte$ECKWERTE_EXTENDED,
      MINIMALRENTE = tl_inp$MINIMALRENTE,
      PREISINDEX = tl_inp$PREISINDEX
  )

  # Berechnung der nominellen Rendite auf den nichtfluessigen Fondsanlagen

  ZINS <- mod_zins(
      PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
      ZINS_RAW = tl_inp$ZINS_RAW,
      ECKWERTE_EXTENDED = tl_eckwerte$ECKWERTE_EXTENDED
  )


  # Reference ages in multiples of years by sex, starting from GO in current year (first
  # element in parameter 'pint'). Beyond the current year, only dates where changes occur
  # must be provided.
  if(tl_inp$PARAM_GLOBAL$jahr_abr <= 2024){
    age_ret_f <- 64
  }else if(tl_inp$PARAM_GLOBAL$jahr_abr <= 2025){
    age_ret_f <- 64+1/4
  }else if(tl_inp$PARAM_GLOBAL$jahr_abr <= 2026){
    age_ret_f <- 64+2/4
  }else if(tl_inp$PARAM_GLOBAL$jahr_abr <= 2027){
    age_ret_f <- 64+3/4
  }else{
    age_ret_f <- 65
  }

  age_ret_m <- 65

  REFTAB <- tribble(
    ~ jahr, ~ sex,       ~ refage,
    tl_inp$PARAM_GLOBAL$jahr_abr,   "f",       age_ret_f,

    2025,   "f",       64 + 1/4,
    2026,   "f",       64 + 2/4,
    2027,   "f",       64 + 3/4,
    2028,   "f",       64 + 4/4,

    tl_inp$PARAM_GLOBAL$jahr_abr,   "m",       age_ret_m)


  # Take-up rates for different pension types by nationality and age in current year.

  PENSION_RATE <- mod_ahv_rate_pension(
    REFTAB = REFTAB,
    PENSION_N = tl_inp$PENSION_N,
    BEV_BESTAND = tl_inp$BEV_BESTAND,
    PARAM_GLOBAL = tl_inp$PARAM_GLOBAL)

  # BFS population scenario Basismodell
  tl_szen_basismodell <- mod_ahv_BFSscenarios_basismodell(
    BEV_SCENARIO = tl_inp$BEV_SCENARIO,
    PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
    PENSION_RATE = PENSION_RATE,
    PENSION_N = tl_inp$PENSION_N,
    PENSION_NM = tl_inp$PENSION_NM,
    RENTENENTWICKLUNG
  )


  RANGE <- mod_ahv_cv_param (tl_inp$PARAM_GLOBAL,
                                tl_inp$AHV_ABRECHNUNG_DEF,
                                RENTENENTWICKLUNG,
                                PENSION_NM = tl_inp$PENSION_NM,
                                BFS_SZEN_BASISMODELL = BFS_SZEN_BASISMODELL,
                                PREISINDEX = tl_inp$PREISINDEX,
                                A_DAT = tl_szen_basismodell$A_DAT)


  HILA_GO <- mod_ahv_hila_go_basismodell(tl_inp$PARAM_GLOBAL,
                                         tl_inp$DEATHS_CH,
                                         tl_inp$HILA_CURRENT,
                                         TAUX_MORTALITE_TOT,
                                         RENTENENTWICKLUNG,
                                         tl_inp$BEV_SCENARIO,
                                         tl_inp$RR_AVS)

  WIDOW_BASISMODELL <- HILA_GO %>%
    mutate(type = "wit") %>%
    select(jahr = year, sex = csex_hila, dom = cdom, type, m = hila_rel, n = benefs_go) %>%
    mutate(sex = recode(sex, `1`   = "m" , `2`   = "f"),
           dom = recode(dom, `100` = "ch", `900` = "au")) %>%
    left_join(RENTENENTWICKLUNG %>%
                mutate(mp = 12 * minimalrente) %>%
                select(jahr, mp) , by = "jahr")

  # Berechnung der nominellen Rendite auf den nichtfluessigen Fondsanlagen

  IV_SCHULD <- mod_ivschuld_scen(
      PARAM_GLOBAL = tl_inp$PARAM_GLOBAL,
      IV_SCHULD_SCEN = tl_inp$IV_SCHULD_SCEN
  )
  # Calcul des scenario pour le parametre d'ajustement des premieres rentes

  CUMPROD_PARAM_ERSTRENTE <- mod_scenario_erstrenten(
      PARAM_GLOBAL = tl_inp$PARAM_GLOBAL
  )


  # Berechnung Beitragssätze der Sozialversicherungen
  BEITRAGSSAETZE            <- mod_beitragssaetze(
      PARAM_GLOBAL       = tl_inp$PARAM_GLOBAL
      , SV_BEITRAGSSATZ    = tl_inp$SV_BEITRAGSSATZ
  )


      c(
          tl_abrechnung,
          tl_eckwerte,
          tl_szen_basismodell,
          list(
              BEVOELKERUNG = BEVOELKERUNG,
              TAUX_MORTALITE = TAUX_MORTALITE,
              TAUX_MORTALITE_TOT = TAUX_MORTALITE_TOT,
              ZINS = ZINS,
              CUMPROD_PARAM_ERSTRENTE = CUMPROD_PARAM_ERSTRENTE,
              DISKONTFAKTOR = DISKONTFAKTOR,
              IV_SCHULD = IV_SCHULD,
              RENTENENTWICKLUNG = RENTENENTWICKLUNG,
              BEITRAGSSAETZE = BEITRAGSSAETZE,
              PENSION_RATE = PENSION_RATE,
              RANGE = RANGE,
              WIDOW_BASISMODELL = WIDOW_BASISMODELL,
              REFTAB = REFTAB
          )
      )
}
