// Copyright 2026 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

fn is_indic_script_for_normalize(script : @common.Script) -> Bool {
  script == @common.script_devanagari ||
  script == @common.script_bengali ||
  script == @common.script_gurmukhi ||
  script == @common.script_gujarati ||
  script == @common.script_oriya ||
  script == @common.script_tamil ||
  script == @common.script_telugu ||
  script == @common.script_kannada ||
  script == @common.script_malayalam
}

fn is_use_script_for_normalize(script : @common.Script) -> Bool {
  script == @common.script_sinhala ||
    script == @common.script_mongolian ||
    script == @common.script_tibetan ||
    script == @common.script_buhid ||
    script == @common.script_hanunoo ||
    script == @common.script_tagalog ||
    script == @common.script_tagbanwa ||
    script == @common.script_limbu ||
    script == @common.script_tai_le ||
    script == @common.script_buginese ||
    script == @common.script_kharoshthi ||
    script == @common.script_syloti_nagri ||
    script == @common.script_tifinagh ||
    script == @common.script_balinese ||
    script == @common.script_nko ||
    script == @common.script_phags_pa ||
    script == @common.script_cham ||
    script == @common.script_kayah_li ||
    script == @common.script_lepcha ||
    script == @common.script_rejang ||
    script == @common.script_saurashtra ||
    script == @common.script_sundanese ||
    script == @common.script_egyptian_hieroglyphs ||
    script == @common.script_javanese ||
    script == @common.script_kaithi ||
    script == @common.script_meetei_mayek ||
    script == @common.script_tai_tham ||
    script == @common.script_tai_viet ||
    script == @common.script_batak ||
    script == @common.script_brahmi ||
    script == @common.script_mandaic ||
    script == @common.script_chakma ||
    script == @common.script_miao ||
    script == @common.script_sharada ||
    script == @common.script_takri ||
    script == @common.script_duployan ||
    script == @common.script_grantha ||
    script == @common.script_khojki ||
    script == @common.script_khudawadi ||
    script == @common.script_mahajani ||
    script == @common.script_manichaean ||
    script == @common.script_modi ||
    script == @common.script_pahawh_hmong ||
    script == @common.script_psalter_pahlavi ||
    script == @common.script_siddham ||
    script == @common.script_tirhuta ||
    script == @common.script_ahom ||
    script == @common.script_multani ||
    script == @common.script_adlam ||
    script == @common.script_bhaiksuki ||
    script == @common.script_marchen ||
    script == @common.script_newa ||
    script == @common.script_masaram_gondi ||
    script == @common.script_soyombo ||
    script == @common.script_zanabazar_square ||
    script == @common.script_dogra ||
    script == @common.script_gunjala_gondi ||
    script == @common.script_hanifi_rohingya ||
    script == @common.script_makasar ||
    script == @common.script_medefaidrin ||
    script == @common.script_old_sogdian ||
    script == @common.script_sogdian ||
    script == @common.script_elymaic ||
    script == @common.script_nandinagari ||
    script == @common.script_nyiakeng_puachue_hmong ||
    script == @common.script_wancho ||
    script == @common.script_chorasmian ||
    script == @common.script_dives_akuru ||
    script == @common.script_khitan_small_script ||
    script == @common.script_yezidi ||
    script == @common.script_cypro_minoan ||
    script == @common.script_old_uyghur ||
    script == @common.script_tangsa ||
    script == @common.script_toto ||
    script == @common.script_vithkuqi ||
    script == @common.script_kawi ||
    script == @common.script_nag_mundari ||
    script == @common.script_garay ||
    script == @common.script_gurung_khema ||
    script == @common.script_kirat_rai ||
    script == @common.script_ol_onal ||
    script == @common.script_sunuwar ||
    script == @common.script_todhri ||
    script == @common.script_tulu_tigalari ||
    script == @common.script_beria_erfe ||
    script == @common.script_sidetic ||
    script == @common.script_tai_yo ||
    script == @common.script_tolong_siki
}

fn compose_for_script(
  script : @common.Script,
  base : UInt,
  mark : UInt,
) -> UInt? {
  if (is_indic_script_for_normalize(script) || is_use_script_for_normalize(script)) &&
    @unicode.is_mark(base) {
    return None
  }
  if is_indic_script_for_normalize(script) && base == 0x09AFU && mark == 0x09BCU {
    return Some(0x09DFU)
  }
  @unicode.compose(base, mark)
}