#' Labeling Kategori Data Proses Siswa TIMSS (Kelas 4)
#'
#' Mengonversi variabel numerik pada data konteks proses siswa TIMSS 2023 Kelas 4
#' menjadi kategori berbahasa Indonesia agar interpretasi analisis lebih jelas.
#'
#' @param data data.frame/tibble berisi variabel-variabel proses siswa TIMSS.
#'
#' @return data.frame/tibble yang berisi kolom-kolom kategori (berlabel Indonesia).
#'
#' @details Pelabelan mengikuti dokumentasi resmi TIMSS 2023.
#'
#' @examples
#' df <- data.frame(IDPOP = c(1,2))
#' K4ProsesSiswa(df)

K4ProsesSiswa <- function(data) {

  if (!is.data.frame(data)) {
    stop("Input harus berupa data.frame")
  }

  map_values <- function(x, map) {
    unname(map[as.character(x)])
  }

  # Ubah angka ke karakter
  if ("IDCNTRY" %in% names(data)) {
    data$IDCNTRY <- as.character(data$IDCNTRY)
  }

  if ("IDSCHOOL" %in% names(data)) {
    data$IDSCHOOL <- as.character(data$IDSCHOOL)
  }

  if ("IDCLASS" %in% names(data)) {
    data$IDCLASS <- as.character(data$IDCLASS)
  }

  if ("IDSTUD" %in% names(data)) {
    data$IDSTUD <- as.character(data$IDSTUD)
  }

  if ("JKZONE" %in% names(data)) {
    data$JKZONE <- as.character(data$JKZONE)
  }

  if ("JKREP" %in% names(data)) {
    data$JKREP <- as.character(data$JKREP)
  }

  if ("VERSION" %in% names(data)) {
    data$VERSION <- as.character(data$VERSION)
  }

  # Mapping
  maps <- list(
    IDPOP <- c("1" = "Populasi 1", "2" = "Populasi 2"),

    IDGRADER <- c("1" = "Tingkat rendah", "2" = "Tingkat tinggi"),

    IDGRADE <- c("3"="Kelas 3","4"="Kelas 4","5"="Kelas 5","6"="Kelas 6"),

    ITASSESS <- c("1"="Digital","2"="Kertas","3"="Kertas (Matematika yang lebih mudah)"),

    IDBOOK <- c("0"="Siswa dikecualikan atau tidak berpartisipasi",
                "1"="Buklet 1", "2"="Buklet 2","3"="Buklet 3","4"="Buklet 4","5"="Buklet 5",
                "6"="Buklet 6","7"="Buklet 7","8"="Buklet 8","9"="Buklet 9","10"="Buklet 10",
                "11"="Buklet 11","12"="Buklet 12","13"="Buklet 13","14"="Buklet 14"),

    ITSEX <- c("1"="Perempuan","2"="Laki-laki"),

    ITADMINI <- c("1"="Staf Pusat Nasional","2"="Guru dari sekolah","3"="Lainnya"),

    ILRELIAB <- c("0"="Salah","1"="Benar"),

    ITLANG_SA <- c(
      "1" = "Bahasa Inggris", "2" = "Bahasa Spanyol", "3" = "Bahasa Perancis", "4" = "Bahasa Afrika", "5" = "Bahasa Albania",
      "8" = "Bahasa Norwegia (Bokmal)",  "9" = "Bahasa Bulgaria",  "10" = "Bahasa Cina",   "11" = "Bahasa Denmark",  "12" = "Bahasa Belanda",
      "13" = "Bahasa Uzbek (Latin)",  "14" = "Bahasa Georgia",  "15" = "Bahasa Jerman",  "16" = "Bahasa Ibrani",  "17" = "Bahasa Hungaria",
      "20" = "Bahasa Italia",  "21" = "Bahasa Latvia",  "22" = "Bahasa Lithuania",  "23" = "Bahasa Makedonia",  "24" = "Bahasa Maori",
      "26" = "Bahasa Norwegia (Nynorsk)",  "27" = "Bahasa Polandia",  "28" = "Bahasa Rumania",  "29" = "Bahasa Rusia",  "30" = "Bahasa Slovakia",
      "32" = "Bahasa Swedia",  "33" = "Bahasa lainnya",  "34" = "Bahasa Ceko",  "35" = "Bahasa Turki",  "36" = "Bahasa Bosnia (Kiril)",
      "37" = "Bahasa Bosnia (Latin)",  "39" = "Bahasa Kazakhstan",  "41" = "Bahasa Irlandia",  "43" = "Bahasa Finlandia",  "44" = "Bahasa Yunani",
      "45" = "Bahasa Portugal",  "47" = "Bahasa Korea",  "48" = "Bahasa Malta",  "49" = "Bahasa Catalan",  "51" = "Bahasa Basque",
      "52" = "Bahasa Valensia",  "53" = "Bahasa Arab",  "54" = "Bahasa Armenia",  "55" = "Bahasa Azerbaijan",  "56" = "Bahasa Kroasia",
      "57" = "Bahasa Galisia",  "58" = "Bahasa Jepang",  "59" = "Bahasa Malaysia",  "60" = "Bahasa Azerbaijan (Latin)",  "61" = "Bahasa Tamil",
      "63" = "Bahasa Persia",  "66" = "Bahasa Tatar",  "67" = "Bahasa Montenegro (Kiril)",  "68" = "Bahasa Montenegro (Latin)",  "69" = "Bahasa Serbia (Kiril)",
      "70" = "Bahasa Serbia (Latin)",  "72" = "Bahasa Uzbekistan (Kiril)",  "73" = "Bahasa Karakalpa",  "79" = "Bahasa Slovenia", "80" = "Bahasa Urdu",
      "81" = "Bahasa Sindhi",  "91" = "Bahasa Badini",  "92" = "Bahasa Sorani"
    ),

    LCID_SA <- c("1025" = "Bahasa Arab (Arab Saudi)", "1026" = "Bahasa Bulgaria (Bulgaria)",  "1028" = "Bahasa Tionghoa (Taiwan)",
                 "1029" = "Bahasa Ceko (Republik Ceko)", "1030" = "Bahasa Denmark (Denmark)", "1031" = "Bahasa Jerman (Jerman)",
                 "1033" = "Bahasa Inggris (Amerika Serikat)", "1035" = "Bahasa Finlandia (Finlandia)", "1036" = "Bahasa Prancis (Prancis)",
                 "1037" = "Bahasa Ibrani (Israel)", "1038" = "Bahasa Hungaria (Hungaria)", "1040" = "Bahasa Italia (Italia)",
                 "1041" = "Bahasa Jepang (Jepang)", "1042" = "Bahasa Korea (Korea)", "1043" = "Bahasa Belanda (Belanda)",
                 "1044" = "Bahasa Norwegia (Bokmal, Norwegia)", "1045" = "Bahasa Polandia (Polandia)", "1046" = "Bahasa Portugis (Brasil)",
                 "1048" = "Bahasa Rumania (Rumania)", "1051" = "Bahasa Slovakia (Republik Slovakia)", "1052" = "Bahasa Albania (Albania)",
                 "1053" = "Bahasa Swedia (Swedia)", "1055" = "Bahasa Turki (Turki)", "1060" = "Bahasa Slovenia (Slovenia)",
                 "1062" = "Bahasa Latvia (Latvia)", "1063" = "Bahasa Lituania (Lituania)",  "1065" = "Bahasa Persia (Iran)",
                 "1067" = "Bahasa Armenia (Armenia)", "1068" = "Bahasa Azerbaijan (Latin, Azerbaijan)", "1071" = "Bahasa Makedonia (Makedonia Utara)",
                 "1078" = "Bahasa Afrikaans (Afrika Selatan)", "1079" = "Bahasa Georgia (Georgia)", "1086" = "Bahasa Melayu (Malaysia)",
                 "1087" = "Bahasa Kazakh (Kazakhstan)",  "1091" = "Bahasa Uzbek (Latin, Uzbekistan)", "1110" = "Bahasa Galisia (Galisia)",
                 "1164" = "Bahasa Inggris (Norwegia)"),

    ITPARTPT1 <- c("1"="Ya","2"="Tidak"),

    ITPARTPT2 <- c("1"="Ya","2"="Tidak"),

    FLAGPT1 <- c("0"="Tidak ada masalah","1"="Dihapus karena masalah teknis","2"="Dihapus karena outlier"),

    FLAGPT2 <- c("0"="Tidak ada masalah","1"="Dihapus karena masalah teknis","2"="Dihapus karena outlier"),

    SCOPE <- c("1" = "Berkas untuk penggunaan publik (PUF)", "2" = "Berkas dengan akses terbatas (RUF)")
  )

  # Apply mapping otomatis
  for (var in names(maps)) {
    if (var %in% names(data)) {
      data[[var]] <- map_values(data[[var]], maps[[var]])
    }
  }

  return(data)
}



