package grib


object Codes {
  def codesToString(discipline: Int, category: Int, product: Int): String = {
    val disciplineName = gribCodes.get(discipline).map(_._1).getOrElse("unknown")
    val categoryName = gribCodes.get(discipline).flatMap(_._2.get(category)).map(_._1).getOrElse("unknown")
    val productName = gribCodes.get(discipline).flatMap(_._2.get(category)).flatMap(_._2.get(product)).getOrElse("unknown")

    s"$disciplineName, $categoryName, $productName"
  }

  private val gribCodes: Map[Int, (String, Map[Int, (String, Map[Int, String])])] = Map(
    0 -> (
      "meteorology",
      Map(
        0 -> (
          "temperature",
          Map(
            0 -> "temperature",
            1 -> "virtual-temperature",
            2 -> "potential-temperature",
            3 -> "pseudo - adiabatic - potential - temperature",
            4 -> "maximum - temperature",
            5 -> "minimum - temperature",
            6 -> "dev - point - temperature",
            7 -> "dev - point - depression",
            8 -> "lapse - rate",
            9 -> "temperature - anomaly",
            10 -> "latent - heat - net - flux",
            11 -> "sensible - heat - net - flux",
            30 -> "latent - heat - net - flux - fue - to - evaporation",
            31 -> "latent - heat - net - flux - due - to - sublimation",
          ),
        ),
        1 -> (
          "moisture",
          Map(
            0 -> "specific-humidity",
            1 -> "relative-humidity",
            2 -> "humidity - mixing - ratio",
            3 -> "precipitable - water",
            4 -> "vapour - pressure",
            5 -> "saturation - deficit",
            6 -> "evaporation",
            7 -> "precipitation - rate",
            8 -> "total - precipitation",
            52 -> "total - precipitation - rate",
            53 -> "total - snowfall - rate - water - equivalent",
            60 -> "snow - depth - water - equivalent",
            64 -> "total - column - integrated - water - vapour",
            65 -> "rain - precipitation - rate",
            69 -> "total - column - integrate - cloud - water",
            70 -> "total - column - integrate - cloud - ice",
            75 -> "graupel - snow - pellets - prepitation - rate",
            128 -> "total - solid - precipitation - rate",
            192 -> "categorical - rain",
            199 -> "potential - evaporation",
          ),
        ),
        2 -> (
          "momentum",
          Map(
            0 -> "wind - direction", // from which blowing
            1 -> "wind - speed",
            2 -> "u - component - of - wind",
            3 -> "v - component - of - wind",
            4 -> "stream - function",
            5 -> "velocity - potential",
            17 -> "momentum - flux - u - component",
            18 -> "momentum - flux - v - component",
            22 -> "wind - speed - gust",
            23 -> "u - component - of - wind - gust",
            24 -> "v - component - of - wind - gust",
          ),
        ),
        3 -> (
          "mass",
          Map(
            0 -> "pressure",
            1 -> "pressure - reduced - to - msl",
            2 -> "pressure - tendency",
            3 -> "icao - standard - atmosphere - reference - height",
            4 -> "geopotential",
            5 -> "geopotential - height",
            6 -> "geometric - height",
          ),
        ),
        4 -> (
          "short-wave-radiation",
          Map(
            0 -> "net - short - wave - radiation - flux - surface",
            1 -> "net - short - wave - radiation - flux - top - of - atmosphere",
            2 -> "short - wave - radiation - flux",
            3 -> "global - radiation - flux",
            4 -> "brightness - temperature",
            5 -> "radiance - with -respect - to - wave - number",
            6 -> "radiance - with -respect - to - wavelength",
            7 -> "downward - short - wave - radiation - flux",
            8 -> "upward - short - wave - radiation - flux",
            9 -> "net - short - wave - radiation - flux",
          ),
        ),
        5 -> (
          "long-wave-radiation",
          Map(
            4 -> "upward-long-wave-radiation-flux",
            5 -> "net-long-wave-radiation-flux",
          ),
        ),
        6 -> (
          "cloud",
          Map(
            0 -> "cloud - ice",
            1 -> "total - cloud - cover",
            2 -> "convective - cloud - cover",
            3 -> "low - cloud - cover",
            4 -> "medium - cloud - cover",
            5 -> "high - cloud - cover",
            6 -> "cloud - water",
            7 -> "cloud - amount",
            8 -> "cloud - type",
            9 -> "thunderstorm - maximum - tops",
            10 -> "thunderstorm - coverage",
            11 -> "cloud - base",
            12 -> "cloud - top",
            32 -> "fraction - of - cloud - cover",
            199 -> "ice - fraction - of - total - condensate",
          ),
        ),
        7 -> (
          "thermodynamic-stability",
          Map(
            6 -> "convective - available - potential - energy",
            7 -> "convective - inhibition",
          ),
        ),
        17 -> (
          "electrodynamics",
          Map(
            193 -> "unknown-local-use",
          ),
        ),
        19 -> (
          "physical-atmospheric",
          Map(
            0 -> "visibility",
            1 -> "albedo",
            2 -> "thunderstorm - probability",
            3 -> "mixed - layer - depth",
            4 -> "volcanic - ash",
          ),
        ),
      ),
    ),

    1 -> (
      "hydrologic",
      Map(),
    ),

    2 -> (
      "land-surface",
      Map(
        0 -> (
          "vegetation-biomass",
          Map(
            0 -> "land-cover",
          )
        )
      ),
    ),

    3 -> (
      "space",
      Map(
        2 -> (
          "charged-particle-mass",
          Map(
            1 -> "electron-density"
          ),
        ),
        6 -> (
          "solar-electromagnetic-emissions",
          Map(
            3 -> "solar-euv-irradiance",
          ),
        ),
      ),
    ),
  )
}

