#' @title Konstruktion des Entwicklungsfaktors für die Rentenanpassung der AHV
#'
#' @description Importiert die Eckwerte eines gewünschten Szenarios und die
#' bisherigen Minimalrenten. Konstruiert daraus ab dem Folgejahr des Renten-
#' registers den Entwicklungsvektor für die Rentenanpassung der AHV.
#'
#' @param PARAM_GLOBAL a single row data frame
#'
#' @param ECKWERTE_EXTENDED a data frame containing the prize, structure and
#'   salary indices, see function \code{\link{mod_input_eckwerte}}.
#'
#' @param MINIMALRENTE a data frame containing the legal minimal pensions per
#'   year, see function \code{\link{mod_input_minimalrente}}.
#'
#' @return a tidylist containing the following tidy data frames:
#'   - `RENTENENTWICKLUNG`
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export


#
mod_rentenentwicklung <- function(PARAM_GLOBAL,
                                  ECKWERTE_EXTENDED,
                                  MINIMALRENTE,
                                  PREISINDEX
                                  ) {
    
    print("Run module: mod_rentenentwicklung")
    
    # Wachstumsrate Preisindex für Minimalrentenentwicklung gemäss Gesetz/Praxis in der Vergangenheit berechnen (vor 2017 Preisindex Ende Jahr, danach Jahresmittel Preisindex, ohne Rebasierung)
  PREISWACHSTUM <- PREISINDEX %>%
      mutate(preisindex=ifelse(jahr<2017,lik_dez_basis_1977,lik_basis_1977),
             preis_mischindex= 100 * (preisindex - lag(preisindex)) / lag(preisindex)
             ) %>%
      select(jahr, preis_mischindex)
    
  RENTENENTWICKLUNG <- ECKWERTE_EXTENDED |>
      left_join(PREISWACHSTUM) %>%
      mutate(preis=ifelse(jahr<=2017,preis_mischindex,preis)) %>%
      select(-preis_mischindex) %>%
      mutate(
          lohn = if_else(is.na(lohn), 0, lohn), # NA-Werte ersetzen
          preis = if_else(is.na(preis), 0, preis), # NA-Werte ersetzen
          lientw = cumprod(1 + lohn / 100), # Indexentwicklung berechnen
          pientw = cumprod(1 + preis / 100), # Indexentwicklung berechnen
          lohnindex = round(1004 * lientw), # Lohnindex berechnen
          preisindex = round(104.1 * pientw, 1), # Preisindex berechnen
          licomp = round(lag(lohnindex) / 10.04, 4), # Lohnkomponente berechnen
          picomp = round(lag(preisindex) / 1.041, 4), # Preiskomponente berechnen
          mischindex = round((licomp + picomp) / 2, 4), # Mischindex berechnen
          minimalrente_rd = 5 * round(5.5 * mischindex / 5) # Gerundete Minimalrente berechnen
      ) |>
      left_join(MINIMALRENTE, by = "jahr") |>
      mutate(
          rentenanpassung = case_when(
              jahr <= max(MINIMALRENTE$jahr, na.rm = TRUE) ~ if_else(minimalrente - lag(minimalrente) > 0, 1, 0),
              jahr == max(MINIMALRENTE$jahr, na.rm = TRUE)+1 ~ if_else(lag(minimalrente) - lag(minimalrente, 2) > 0, 0, 1), 
              TRUE ~ jahr %% 2
          ), # Anpassungsrhythmus bestimmen
          minimalrente_pj = pmax(
              rentenanpassung * minimalrente_rd,
              lag(rentenanpassung * minimalrente_rd, default = 0)
          ), # Projektierte Minimalrente berechnen
          minimalrente = case_when(
              jahr <= max(MINIMALRENTE$jahr, na.rm = TRUE) ~ minimalrente,
              jahr == max(MINIMALRENTE$jahr, na.rm = TRUE)+1 ~ ifelse(rentenanpassung==1,minimalrente_pj,lag(minimalrente)),
              TRUE ~ minimalrente_pj
          ) # Finalisierte Minimalrente setzen
      ) %>%
      mutate(
          dminimalrente = (minimalrente - lag(minimalrente)) / lag(minimalrente, default = 0), # Wachstumsrate berechnen
          rentenentwicklung = cumprod(1 + if_else(jahr > PARAM_GLOBAL$jahr_rr, dminimalrente, 0)) # Rentenentwicklung berechnen
      ) %>%
      select(-c(preis, lohn, dminimalrente, minimalrente_pj, minimalrente_rd, licomp, picomp))

  # Ausgabe vorbereiten
  return(RENTENENTWICKLUNG  = RENTENENTWICKLUNG)
}
