#' @title Default-Parameter setzten
#'
#' @description: Setzt default-Parameterwerte in PARAM_GLOBAL.
#'
#' @param PARAM_GLOBAL       - Parameter
#'
#' @return `tidylist` mit:
#'  `PARAM_GLOBAL`                  - Mit default-Werten ergänztes PARAM_GLOBAL file.
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export


mod_ahv_param_global <- function(
        PARAM_GLOBAL,
        ECKWERTE,
        ESTV,
        AHV_ABRECHNUNG_PROV,
        AHV_ABRECHNUNG_DEF,
        IK,
        RR_AVS,
        BEV_BESTAND,
        SV_BEITRAGSSATZ,
        IV_SCHULD_SCEN
) {
    # print message in console that module is running.
    print("Run module: mod_ahv_param_global")
    
    
    ## DEFAULT PARAMETER SETZEN, UM AKTUELLSTE WERTE ZU VERWENDEN (bspw. damit, falls nicht anders spezifiziert, die neusten ESTV MWST-Szenarien verwendet werden)
    
    # ESTV MwSt.-Szenario:
    # Überprüfe, ob id_estv existiert
    if (!"id_estv" %in% names(PARAM_GLOBAL)) {
        # Finde den höchsten Wert von "laufjahr" und "version"
        estv_selected <- ESTV |>
            filter(laufjahr == max(laufjahr)) |>
            filter(version == max(version))
        
        # Extrahiere eindeutige idestv
        unique_idestv <- estv_selected |>
            distinct(idestv)
        
        # Prüfe Anzahl verschiedener idestv
        if (nrow(unique_idestv) > 1) {
            # Werfe Fehler
            stop(
                "Mehrere verschiedene idestv im Dataframe ESTV mit dem höchsten Wert von laufjahr und version gefunden. In PARAM_GLOBAL mit Hilfe des Parameters idestv eine Version explizit auswählen."
            )
        } else {
            # Setze id_estv auf den eindeutigen Eintrag
            PARAM_GLOBAL$id_estv <- unique_idestv$idestv
        }
        
        # Entferne Hilfsobjekte
        rm(estv_selected, unique_idestv)
    }
    
    # Eckwerte:
    # Überprüfe, ob id_eckwerte existiert
    if (!"id_eckwerte" %in% names(PARAM_GLOBAL)) {
        
        # Finde den höchsten Wert von "laufjahr" und "version"
        id_selected <- ECKWERTE %>%
            filter(laufjahr == max(laufjahr)) %>%               # Finde den höchsten "laufjahr"
            filter(version == max(version))                     # Finde den höchsten "version"
        
        # Prüfe, ob mehrere verschiedene idestv existieren
        unique_id <- id_selected %>% distinct(id)
        
        if (nrow(unique_id) != 1) {
            stop("Mehrere verschiedene id im Dataframe ECKWERTE mit dem höchsten Wert von laufjahr und version gefunden. Code wird angehalten.")
        } else {
            # Setze id_estv in PARAM_GLOBAL auf den ausgewählten Wert
            PARAM_GLOBAL$id_eckwerte <- unique_id$id
        }
        rm(id_selected, unique_id)
    }
    
    # IV-Schulden Rückzahlungsprojektion:
    # Überprüfe, ob id_eckwerte existiert
    if (!"ivschuld_scen" %in% names(PARAM_GLOBAL)) {
        
        # Finde den höchsten Wert von laufjahr und version
        id_selected <- IV_SCHULD_SCEN |>
            filter(laufjahr == max(laufjahr)) |>
            filter(version == max(version))
        
        # Prüfe, ob mehrere verschiedene scen existieren
        unique_id <- id_selected |>
            distinct(scen)
        
        if (nrow(unique_id) != 1) {
            stop("Mehrere verschiedene scen im Dataframe IV_SCHULD_SCEN mit dem höchsten Wert von laufjahr und version gefunden. In PARAM_GLOBAL mit Hilfe des Parameters ivschuld_scen eine Version explizit auswählen.")
        } else {
            # Setze ivschuld_scen in PARAM_GLOBAL auf den ausgewählten Wert
            PARAM_GLOBAL$ivschuld_scen <- unique_id$scen
        }
        
        # Entferne Hilfsobjekte
        rm(id_selected, unique_id)
    }
    
    # FHH für das mittlere Szenario (Basisszenario) berechnen, falls nicht festgelegt
    if(!"szenario_fhh" %in% names(PARAM_GLOBAL) || PARAM_GLOBAL$szenario_fhh == "mittel"|| PARAM_GLOBAL$szenario_fhh == "basis") {
      PARAM_GLOBAL$szenario_fhh <- "referenz"
    }
  
    # Setze bev_scenario auf B_00_2025, falls Szenario günstig ist und kein passender Wert vorhanden ist
    if (PARAM_GLOBAL$szenario_fhh == "hoch" &&
        (!"bev_scenario" %in% names(PARAM_GLOBAL) || !startsWith(PARAM_GLOBAL$bev_scenario, "B_00"))) {
      PARAM_GLOBAL$bev_scenario <- "B_00_2025"
      warning("PARAM_GLOBAL$bev_scenario wurde auf B_00_2025 gesetzt, da PARAM_GLOBAL$szenario_fhh=='hoch'")
    }
    
    # Setze bev_scenario auf C_00_2025, falls Szenario ungünstig ist und kein passender Wert vorhanden ist
    if (PARAM_GLOBAL$szenario_fhh == "tief" &&
        (!"bev_scenario" %in% names(PARAM_GLOBAL) || !startsWith(PARAM_GLOBAL$bev_scenario, "C_00"))) {
      PARAM_GLOBAL$bev_scenario <- "C_00_2025"
      warning("PARAM_GLOBAL$bev_scenario wurde auf C_00_2025 gesetzt, da PARAM_GLOBAL$szenario_fhh=='tief'")
    }
  
    # Folgender Code nimmt das Referenzszenario an, falls kein Szenario in PARAM_GLOBAL spezifiziert wurde.
    if (!"bev_scenario" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$bev_scenario <- "A_00_2025"
    }
    
    # letztes Abrechnungsjahr festlegen, falls nicht festgelegt
    if(!"jahr_abr" %in% names(PARAM_GLOBAL)) {
        if(PARAM_GLOBAL$abr_prov==TRUE){
            PARAM_GLOBAL$jahr_abr <- max(AHV_ABRECHNUNG_PROV$jahr)
        }
        else{
            PARAM_GLOBAL$jahr_abr <- max(AHV_ABRECHNUNG_DEF$jahr) 
        }
    }
    
    # Preisbasis auf Abrechnungsjahr legen, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"jahr_preisbasis" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_preisbasis <- PARAM_GLOBAL$jahr_abr
    }

    
    # Der Parameter max_age (höchstes Alter in Modellteilen) auf 99 setzen, falls nicht anders angegeben
    if(!"max_age" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$max_age <- 99
    }
    
    # Der Parameter min_age (tiefstes Alter in Modellteilen) auf 0 setzen, falls nicht anders angegeben
    if(!"min_age" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$min_age <- 0
    }
    
    # Die Versicherung auf AHV setzten, falls nicht anders angegeben
    if(!"vz" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$vz <- "ahv"
    }
    
    # Jahr des Beginns des Resultatevektors auf 1997 setzten, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"jahr_beginn" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_beginn <- 1997
    }
    
    
    # Bestimme Jahr für Bevölkerungsbestand, falls nicht gesetzt
    if (!"jahr_bev" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_bev <- BEV_BESTAND |>
            filter(!is.na(bevendejahr)) |>
            summarise(max_jahr = max(jahr)) |>
            pull(max_jahr)
    }
    
    # Ende des Projektionshorizonts festlegen, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"jahr_ende" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_ende <- 2070
    }
    
    # Darstellungsoptionen auf default setzten, falls nicht in PARAM_GLOBAL.csv gesetzt 
    if(!"intern_output_feature_on" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$intern_output_feature_on <- TRUE
    }
    if(!"light_output" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$light_output <- FALSE
    }
    
    # Jahr des Rentenregisters setzten (falls nicht in PARAM_GLOBAL.csv gesetzt)
    if(!"jahr_rr" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_rr <- max(RR_AVS$jahr)
    }
    
    # Minimumjahr für Beitragszahlungen setzten, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"min_age_cot" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$min_age_cot <- 21
    }
    
    # Minimalalter für Frühbezug setzten, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"min_age_retraite" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$min_age_retraite <- 62
    }
    
    # Maximalalter für Aufschub setzten, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"max_age_retraite" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$max_age_retraite <- 70
    }
    
    
    # laufendes Jahr jahr_lj festlegen, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"jahr_lj" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_lj <- PARAM_GLOBAL$jahr_abr+1
    }
    
    # nombre total d'années pouvant être ajournées auf 5 setzten, falls nicht in PARAM_GLOBAL.csv gesetzt
    if(!"max_annees_ajo" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$max_annees_ajo <- 5
    }
    
    # justierung=0 setzten für Modul "justierung.R"
    if(!"justierung" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$justierung <- 0       
    }
    
    # Jahr des IK setzten (falls nicht in PARAM_GLOBAL.csv gesetzt)
    if(!"jahr_ik" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_ik <- max(IK$jahr)
    }
    
    # Filenamen für das AHV-FHH .xlsx setzten (falls nicht in PARAM_GLOBAL.csv gesetzt)
    if(!"file_ahvoutput" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$file_ahvoutput <- "FH_AHV.xlsx"
    }
    
    # Spalten, die im Output in Millionen ausgegeben werden definieren, falls nicht definieren
    if(!"spaltenmio" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$spaltenmio <- "aus_tot, btr_vs_ag, btr_mwst, btr_bund, btr_uebr, ein_total, erg_umlag, kap_etr, erg_betr, kap, kap_oiv" # Spalten, die in den aufbereiteten Output-files (e.g., FHH_AHV.xlsx)  in Millionen Franken ausgegeben werden
    }
    
    # Spalten mit den indizes für den Output, falls nicht definieren
    if(!"spaltenidx" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$spaltenidx <- "indx_ausg_ls, indx_uml_mwst, indx_uml_ls, indx_bed_mwst, indx_bed_ls, indx_kap_ausg, indx_kap_oiv_ausg, indx_ersq" 
    }
    
    # Spalten mit den indizes für den Output, falls nicht definieren
    if(!"cols_with_pc" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$cols_with_pc <- "aus_tot, btr_vs_ag, btr_mwst, btr_bund, btr_uebr, ein_total" # Spalten, für welche in den aufbereiteten Output-files (e.g., FHH_AHV.xlsx) Jahr-zu-Jahr Wachstumsraten angezeigt werden.
    }
    
    # Massnahmen-Output bis zum gleichen Jahr wie FHH-Output, falls nicht definieren
    if(!"jahr_lastoutput_massn" %in% names(PARAM_GLOBAL)) {
        PARAM_GLOBAL$jahr_lastoutput_massn <- PARAM_GLOBAL$jahr_lastoutput
    }
    
    #------ Output --------------------------------------------------------#
    return(PARAM_GLOBAL = PARAM_GLOBAL)    
    
}
