///|
/// A writing system as franc-min distinguishes them. `Kana` covers
/// Hiragana and Katakana together with the Han ideographs used in
/// Japanese text.
pub(all) enum Script {
  Han
  Latin
  Cyrillic
  Arabic
  Bengali
  Devanagari
  Kana
  Javanese
  Hangul
  Telugu
  Tamil
  Gujarati
  Kannada
  Malayalam
  Myanmar
  Gurmukhi
  Ethiopic
  Thai
  Sinhala
  Greek
} derive(Eq, Hash, Debug)

///|
let all_scripts : FixedArray[Script] = [
  Han,
  Latin,
  Cyrillic,
  Arabic,
  Bengali,
  Devanagari,
  Kana,
  Javanese,
  Hangul,
  Telugu,
  Tamil,
  Gujarati,
  Kannada,
  Malayalam,
  Myanmar,
  Gurmukhi,
  Ethiopic,
  Thai,
  Sinhala,
  Greek,
]

///|
/// Every supported script, in mbglot's fixed order.
pub fn Script::all() -> Array[Script] {
  Array::from_fixed_array(all_scripts)
}

///|
/// English name of the script.
pub fn Script::name(self : Script) -> String {
  match self {
    Han => "Han"
    Latin => "Latin"
    Cyrillic => "Cyrillic"
    Arabic => "Arabic"
    Bengali => "Bengali"
    Devanagari => "Devanagari"
    Kana => "Kana"
    Javanese => "Javanese"
    Hangul => "Hangul"
    Telugu => "Telugu"
    Tamil => "Tamil"
    Gujarati => "Gujarati"
    Kannada => "Kannada"
    Malayalam => "Malayalam"
    Myanmar => "Myanmar"
    Gurmukhi => "Gurmukhi"
    Ethiopic => "Ethiopic"
    Thai => "Thai"
    Sinhala => "Sinhala"
    Greek => "Greek"
  }
}

///|
/// Writes the script name.
pub impl Show for Script with fn output(self, logger) {
  logger.write_string(self.name())
}

///|
/// The only language franc-min writes in this script, or `None` for the
/// scripts whose languages are told apart by trigram profiles.
fn Script::sole_language(self : Script) -> Lang? {
  match self {
    Han => Some(Cmn)
    Bengali => Some(Ben)
    Kana => Some(Jpn)
    Javanese => Some(Jav)
    Hangul => Some(Kor)
    Telugu => Some(Tel)
    Tamil => Some(Tam)
    Gujarati => Some(Guj)
    Kannada => Some(Kan)
    Malayalam => Some(Mal)
    Myanmar => Some(Mya)
    Gurmukhi => Some(Pan)
    Ethiopic => Some(Amh)
    Thai => Some(Tha)
    Sinhala => Some(Sin)
    Greek => Some(Ell)
    Latin | Cyrillic | Arabic | Devanagari => None
  }
}