/// Language registry for the eleven shipped stemmer packages.
///
/// Data model is locked by the shared interface contract §3.1: six fields,
/// fixed order, no optional fields.  `charset` is a `String` whose empty value
/// means "no special non-ASCII note" — it is deliberately not an `Option`.
///
/// `lines` values are derived, not estimated:
///   `wc -l .planning/data/sd//voc.txt`
///   `gzip -dc .planning/data/sd/arabic/voc.txt.gz | wc -l`
/// They equal the expected `checked` count of the gate's golden run.
///
/// The registry holds the eleven deliverables only; the 3.1.1 control input is
/// a pipeline/gate-only entry and is intentionally absent here.

pub struct LangEntry { name : String; pkg : String; golden_dir : String; lines : Int; compressed : Bool; charset : String }

pub let langs : Array[LangEntry] = [
  {
    name : "arabic",
    pkg : "vicoproplus/moon_snowball/arabic",
    golden_dir : "arabic",
    lines : 9196214,
    compressed : true,
    charset : "阿拉伯字母(U+0600–U+06FF 区段)",
  },
  {
    name : "dutch",
    pkg : "vicoproplus/moon_snowball/dutch",
    golden_dir : "dutch",
    lines : 45670,
    compressed : false,
    charset : "á(U+00E1)、à、ä、é、è、ë、í、ï、ó、ö、ú、ü",
  },
  {
    name : "english",
    pkg : "vicoproplus/moon_snowball/english",
    golden_dir : "english",
    lines : 42649,
    compressed : false,
    charset : "",
  },
  {
    name : "french",
    pkg : "vicoproplus/moon_snowball/french",
    golden_dir : "french",
    lines : 21653,
    compressed : false,
    charset : "é(U+00E9)、è、ê、ç、à、ô、û 等拉丁补充区;语料 NFC、无组合字符",
  },
  {
    name : "german",
    pkg : "vicoproplus/moon_snowball/german",
    golden_dir : "german",
    lines : 35053,
    compressed : false,
    charset : "ä(U+00E4)、ö、ü、ß(U+00DF);ß 是单码点(非 ss 连写)",
  },
  {
    name : "italian",
    pkg : "vicoproplus/moon_snowball/italian",
    golden_dir : "italian",
    lines : 37426,
    compressed : false,
    charset : "à(U+00E0)、è、é、ì、ò、ù",
  },
  {
    name : "porter",
    pkg : "vicoproplus/moon_snowball/porter",
    golden_dir : "porter",
    lines : 42603,
    compressed : false,
    charset : "",
  },
  {
    name : "portuguese",
    pkg : "vicoproplus/moon_snowball/portuguese",
    golden_dir : "portuguese",
    lines : 32016,
    compressed : false,
    charset : "á、à、â、ã(U+00E3)、ç、é、ê、í、ó、ô、õ、ú",
  },
  {
    name : "russian",
    pkg : "vicoproplus/moon_snowball/russian",
    golden_dir : "russian",
    lines : 49785,
    compressed : false,
    charset : "西里尔 U+0400–U+04FF",
  },
  {
    name : "spanish",
    pkg : "vicoproplus/moon_snowball/spanish",
    golden_dir : "spanish",
    lines : 28378,
    compressed : false,
    charset : "á(U+00E1)、é、í、ó、ú、ñ(U+00F1)",
  },
  {
    name : "turkish",
    pkg : "vicoproplus/moon_snowball/turkish",
    golden_dir : "turkish",
    lines : 96325,
    compressed : false,
    charset : "ı(U+0131)、ş、ğ",
  },
]

/// Look up a language by its upstream stemmer name.
///
/// Returns `None` for any name that is not one of the eleven deliverables.
pub fn lookup(name : String) -> LangEntry? {
  for entry in langs {
    if entry.name == name {
      return Some(entry)
    }
  }
  None
}