#' @title Berechnung der Kapitalertraege und des Fondstandes
#'
#' @description Berechnungen fuer die AHV. Kapital ohne Schuld der IV
#'
#' @param PARAM_GLOBAL a single row data frame
#'
#' @param AHV_AUSGABEN data frame containing the nominal benefits data, see functions
#' \code{\link{mod_ahv_ausgaben}} and \code{\link{wrap_ahv_massnahmen}} in case
#' of reforms.
#'
#' @param AHV_EINNAHMEN A data frame containing the contributions data, see functions
#' \code{\link{mod_ahv_ausgaben}} and \code{\link{wrap_ahv_massnahmen}} in case
#' of reforms.
#'
#' @param IV_SCHULD data frame containing the iv dept data
#'
#' @param AHV_ABRECHNUNG data frame containing the AHV Abrechnungsdaten, see function
#' \code{\link{mod_input_ahv_abrechnung}}.
#'
#' @param ZINS data frame containing interest rates
#'
#' @return The following tidy data frames:
#' 
#'   - `AHV_BILANZ`
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export

#
mod_ahv_bilanz <- function(PARAM_GLOBAL,
                           AHV_AUSGABEN,
                           AHV_EINNAHMEN,
                           ZINS,
                           AHV_ABRECHNUNG,
                           IV_SCHULD
) {
    
    print("Run module: mod_ahv_bilanz")
    
    ### AHV Bilanz und Erfolgsrechnung berechnen
  
    # Falls Abrechnungsjahr 2024 ist: Auswirkung der neuen Rechnungslegung (IPSAS) berücksichtigen: Erhöhung der Eigenmittel um 470 Mio. CHF (Restatement)  
    if(PARAM_GLOBAL$jahr_abr==2024){
      AHV_ABRECHNUNG <- AHV_ABRECHNUNG %>%
        mutate(kap=ifelse(jahr==2024,kap+469805459,kap))
    }
  
  # file.path("container_abr23def_va25005_estv253_avs2124_deplaf_200_13mr_fin_202_fin_13_fin_deplaf_etlin_2028_ohne_s")
    
    # Bilanz aus Einnahme- und Ausgabevektor und Abrechnung erstellen
    AHV_BILANZ <- tibble(jahr = PARAM_GLOBAL$jahr_beginn:PARAM_GLOBAL$jahr_ende) %>%
        left_join(AHV_AUSGABEN, by = "jahr") %>%
        left_join(AHV_EINNAHMEN, by = "jahr") %>%
        mutate_all(list(~as.numeric(.))) %>%
        mutate(erg_umlag = ein_total - aus_tot) %>%
        left_join(AHV_ABRECHNUNG %>% select(jahr, kap, anl_erg_tot, erg_betr, fl_mtl), by = "jahr") %>%
        rename(kap_etr = anl_erg_tot) %>%
        left_join(IV_SCHULD, by = "jahr") %>%
        mutate(kap_oiv = kap + schuld_iv) %>%
        left_join(ZINS %>% select(jahr, nominal_zins_fonds), by = "jahr")
    
    # Anteil des Fonds, der nicht flüssige Mittel oder Anlagen ist, berechnen (für Schätzung von Zinsertrag unten)
    AHV_BILANZ <- AHV_BILANZ |>
        mutate(ant_ausgaben_nichtanlagen = (lag(kap_oiv) - lag(fl_mtl))/aus_tot) |> # Annahme: Vor Jahresende wird dem Fonds der Betrag entnommen, welcher für die Deckung der laufenden Ausgaben des kommenden Jahres benötigt wird (wird laut Brief von Compenswiss an Bundesrat vom Dezember 2024 so gemacht).
        mutate(
            ant_ausgaben_nichtanlagen = if_else(
                jahr > PARAM_GLOBAL$jahr_abr,
                mean(
                    ant_ausgaben_nichtanlagen[
                        between(jahr, PARAM_GLOBAL$jahr_abr - 9, PARAM_GLOBAL$jahr_abr) # Anteil für zukünftige Jahre als Durchschnittlicher Anteil der letzten 10 Jahre
                    ],
                    na.rm = TRUE
                ),
                ant_ausgaben_nichtanlagen
            )
        )
    
    ## Rekursive Berechnung des Zinsertrags und des Fondsstands
    for(l_j in (PARAM_GLOBAL$jahr_abr + 1):PARAM_GLOBAL$jahr_ende) {
        
        AHV_BILANZ <- AHV_BILANZ %>%
            mutate(
                # Berechne Kapitalertrag
                kap_etr = if_else(
                    jahr == l_j,
                    (lag(fl_mtl) + erg_umlag / 2) * nominal_zins_fonds + zins_iv,
                    kap_etr
                ),
                erg_betr = if_else(
                    jahr == l_j,
                    erg_umlag + kap_etr,
                    erg_betr
                ),
                kap = if_else(
                    jahr == l_j,
                    lag(kap) + erg_betr,
                    kap
                ),
                kap_oiv = if_else(
                    jahr == l_j,
                    kap + schuld_iv,
                    kap_oiv
                ),
                fl_mtl = case_when(
                    jahr == l_j & jahr != PARAM_GLOBAL$jahr_ende ~ kap_oiv - ant_ausgaben_nichtanlagen * lead(aus_tot),
                    jahr == l_j & jahr == PARAM_GLOBAL$jahr_ende ~ kap_oiv - ant_ausgaben_nichtanlagen * aus_tot, # diesjährige Ausgaben verwenden im letzten Projektionsjahr
                    TRUE ~ fl_mtl
                )
            )
    }
    
    return(AHV_BILANZ = AHV_BILANZ)
}
