// This file binds the zg library to C. We use zg to:
// 1. Segment text into scripts for shaping boundaries
// 2. Find Unicode grapheme boundaries for fallback shaping
// 3. Eventually: segment text into emoji and non-emojis for font selection
//    (this will rewuire a PR to zg though)
const Scripts = @import("Scripts");
const std = @import("std");

pub const Script = enum(c_int) {
    none,
    Adlam,
    Ahom,
    Anatolian_Hieroglyphs,
    Arabic,
    Armenian,
    Avestan,
    Balinese,
    Bamum,
    Bassa_Vah,
    Batak,
    Bengali,
    Bhaiksuki,
    Bopomofo,
    Brahmi,
    Braille,
    Buginese,
    Buhid,
    Canadian_Aboriginal,
    Carian,
    Caucasian_Albanian,
    Chakma,
    Cham,
    Cherokee,
    Chorasmian,
    Common,
    Coptic,
    Cuneiform,
    Cypriot,
    Cypro_Minoan,
    Cyrillic,
    Deseret,
    Devanagari,
    Dives_Akuru,
    Dogra,
    Duployan,
    Egyptian_Hieroglyphs,
    Elbasan,
    Elymaic,
    Ethiopic,
    Garay,
    Georgian,
    Glagolitic,
    Gothic,
    Grantha,
    Greek,
    Gujarati,
    Gunjala_Gondi,
    Gurmukhi,
    Gurung_Khema,
    Han,
    Hangul,
    Hanifi_Rohingya,
    Hanunoo,
    Hatran,
    Hebrew,
    Hiragana,
    Imperial_Aramaic,
    Inherited,
    Inscriptional_Pahlavi,
    Inscriptional_Parthian,
    Javanese,
    Kaithi,
    Kannada,
    Katakana,
    Kawi,
    Kayah_Li,
    Kharoshthi,
    Khitan_Small_Script,
    Khmer,
    Khojki,
    Khudawadi,
    Kirat_Rai,
    Lao,
    Latin,
    Lepcha,
    Limbu,
    Linear_A,
    Linear_B,
    Lisu,
    Lycian,
    Lydian,
    Mahajani,
    Makasar,
    Malayalam,
    Mandaic,
    Manichaean,
    Marchen,
    Masaram_Gondi,
    Medefaidrin,
    Meetei_Mayek,
    Mende_Kikakui,
    Meroitic_Cursive,
    Meroitic_Hieroglyphs,
    Miao,
    Modi,
    Mongolian,
    Mro,
    Multani,
    Myanmar,
    Nabataean,
    Nag_Mundari,
    Nandinagari,
    New_Tai_Lue,
    Newa,
    Nko,
    Nushu,
    Nyiakeng_Puachue_Hmong,
    Ogham,
    Ol_Chiki,
    Ol_Onal,
    Old_Hungarian,
    Old_Italic,
    Old_North_Arabian,
    Old_Permic,
    Old_Persian,
    Old_Sogdian,
    Old_South_Arabian,
    Old_Turkic,
    Old_Uyghur,
    Oriya,
    Osage,
    Osmanya,
    Pahawh_Hmong,
    Palmyrene,
    Pau_Cin_Hau,
    Phags_Pa,
    Phoenician,
    Psalter_Pahlavi,
    Rejang,
    Runic,
    Samaritan,
    Saurashtra,
    Sharada,
    Shavian,
    Siddham,
    SignWriting,
    Sinhala,
    Sogdian,
    Sora_Sompeng,
    Soyombo,
    Sundanese,
    Sunuwar,
    Syloti_Nagri,
    Syriac,
    Tagalog,
    Tagbanwa,
    Tai_Le,
    Tai_Tham,
    Tai_Viet,
    Takri,
    Tamil,
    Tangsa,
    Tangut,
    Telugu,
    Thaana,
    Thai,
    Tibetan,
    Tifinagh,
    Tirhuta,
    Todhri,
    Toto,
    Tulu_Tigalari,
    Ugaritic,
    Vai,
    Vithkuqi,
    Wancho,
    Warang_Citi,
    Yezidi,
    Yi,
    Zanabazar_Square,
};

var scripts: Scripts = undefined;
var initialized: bool = false;

export fn get_script(codepoint: u32) Script {
    // TODO: initialize once, not every get_script call
    if (!initialized) {
        scripts = Scripts.init(std.heap.c_allocator) catch @panic("Failed to initialize scripts");
        initialized = true;
    }

    const script_result = scripts.script(@as(u21, @intCast(codepoint))) orelse return .none;

    return switch (script_result) {
        .none => .none,
        .Adlam => .Adlam,
        .Ahom => .Ahom,
        .Anatolian_Hieroglyphs => .Anatolian_Hieroglyphs,
        .Arabic => .Arabic,
        .Armenian => .Armenian,
        .Avestan => .Avestan,
        .Balinese => .Balinese,
        .Bamum => .Bamum,
        .Bassa_Vah => .Bassa_Vah,
        .Batak => .Batak,
        .Bengali => .Bengali,
        .Bhaiksuki => .Bhaiksuki,
        .Bopomofo => .Bopomofo,
        .Brahmi => .Brahmi,
        .Braille => .Braille,
        .Buginese => .Buginese,
        .Buhid => .Buhid,
        .Canadian_Aboriginal => .Canadian_Aboriginal,
        .Carian => .Carian,
        .Caucasian_Albanian => .Caucasian_Albanian,
        .Chakma => .Chakma,
        .Cham => .Cham,
        .Cherokee => .Cherokee,
        .Chorasmian => .Chorasmian,
        .Common => .Common,
        .Coptic => .Coptic,
        .Cuneiform => .Cuneiform,
        .Cypriot => .Cypriot,
        .Cypro_Minoan => .Cypro_Minoan,
        .Cyrillic => .Cyrillic,
        .Deseret => .Deseret,
        .Devanagari => .Devanagari,
        .Dives_Akuru => .Dives_Akuru,
        .Dogra => .Dogra,
        .Duployan => .Duployan,
        .Egyptian_Hieroglyphs => .Egyptian_Hieroglyphs,
        .Elbasan => .Elbasan,
        .Elymaic => .Elymaic,
        .Ethiopic => .Ethiopic,
        .Garay => .Garay,
        .Georgian => .Georgian,
        .Glagolitic => .Glagolitic,
        .Gothic => .Gothic,
        .Grantha => .Grantha,
        .Greek => .Greek,
        .Gujarati => .Gujarati,
        .Gunjala_Gondi => .Gunjala_Gondi,
        .Gurmukhi => .Gurmukhi,
        .Gurung_Khema => .Gurung_Khema,
        .Han => .Han,
        .Hangul => .Hangul,
        .Hanifi_Rohingya => .Hanifi_Rohingya,
        .Hanunoo => .Hanunoo,
        .Hatran => .Hatran,
        .Hebrew => .Hebrew,
        .Hiragana => .Hiragana,
        .Imperial_Aramaic => .Imperial_Aramaic,
        .Inherited => .Inherited,
        .Inscriptional_Pahlavi => .Inscriptional_Pahlavi,
        .Inscriptional_Parthian => .Inscriptional_Parthian,
        .Javanese => .Javanese,
        .Kaithi => .Kaithi,
        .Kannada => .Kannada,
        .Katakana => .Katakana,
        .Kawi => .Kawi,
        .Kayah_Li => .Kayah_Li,
        .Kharoshthi => .Kharoshthi,
        .Khitan_Small_Script => .Khitan_Small_Script,
        .Khmer => .Khmer,
        .Khojki => .Khojki,
        .Khudawadi => .Khudawadi,
        .Kirat_Rai => .Kirat_Rai,
        .Lao => .Lao,
        .Latin => .Latin,
        .Lepcha => .Lepcha,
        .Limbu => .Limbu,
        .Linear_A => .Linear_A,
        .Linear_B => .Linear_B,
        .Lisu => .Lisu,
        .Lycian => .Lycian,
        .Lydian => .Lydian,
        .Mahajani => .Mahajani,
        .Makasar => .Makasar,
        .Malayalam => .Malayalam,
        .Mandaic => .Mandaic,
        .Manichaean => .Manichaean,
        .Marchen => .Marchen,
        .Masaram_Gondi => .Masaram_Gondi,
        .Medefaidrin => .Medefaidrin,
        .Meetei_Mayek => .Meetei_Mayek,
        .Mende_Kikakui => .Mende_Kikakui,
        .Meroitic_Cursive => .Meroitic_Cursive,
        .Meroitic_Hieroglyphs => .Meroitic_Hieroglyphs,
        .Miao => .Miao,
        .Modi => .Modi,
        .Mongolian => .Mongolian,
        .Mro => .Mro,
        .Multani => .Multani,
        .Myanmar => .Myanmar,
        .Nabataean => .Nabataean,
        .Nag_Mundari => .Nag_Mundari,
        .Nandinagari => .Nandinagari,
        .New_Tai_Lue => .New_Tai_Lue,
        .Newa => .Newa,
        .Nko => .Nko,
        .Nushu => .Nushu,
        .Nyiakeng_Puachue_Hmong => .Nyiakeng_Puachue_Hmong,
        .Ogham => .Ogham,
        .Ol_Chiki => .Ol_Chiki,
        .Ol_Onal => .Ol_Onal,
        .Old_Hungarian => .Old_Hungarian,
        .Old_Italic => .Old_Italic,
        .Old_North_Arabian => .Old_North_Arabian,
        .Old_Permic => .Old_Permic,
        .Old_Persian => .Old_Persian,
        .Old_Sogdian => .Old_Sogdian,
        .Old_South_Arabian => .Old_South_Arabian,
        .Old_Turkic => .Old_Turkic,
        .Old_Uyghur => .Old_Uyghur,
        .Oriya => .Oriya,
        .Osage => .Osage,
        .Osmanya => .Osmanya,
        .Pahawh_Hmong => .Pahawh_Hmong,
        .Palmyrene => .Palmyrene,
        .Pau_Cin_Hau => .Pau_Cin_Hau,
        .Phags_Pa => .Phags_Pa,
        .Phoenician => .Phoenician,
        .Psalter_Pahlavi => .Psalter_Pahlavi,
        .Rejang => .Rejang,
        .Runic => .Runic,
        .Samaritan => .Samaritan,
        .Saurashtra => .Saurashtra,
        .Sharada => .Sharada,
        .Shavian => .Shavian,
        .Siddham => .Siddham,
        .SignWriting => .SignWriting,
        .Sinhala => .Sinhala,
        .Sogdian => .Sogdian,
        .Sora_Sompeng => .Sora_Sompeng,
        .Soyombo => .Soyombo,
        .Sundanese => .Sundanese,
        .Sunuwar => .Sunuwar,
        .Syloti_Nagri => .Syloti_Nagri,
        .Syriac => .Syriac,
        .Tagalog => .Tagalog,
        .Tagbanwa => .Tagbanwa,
        .Tai_Le => .Tai_Le,
        .Tai_Tham => .Tai_Tham,
        .Tai_Viet => .Tai_Viet,
        .Takri => .Takri,
        .Tamil => .Tamil,
        .Tangsa => .Tangsa,
        .Tangut => .Tangut,
        .Telugu => .Telugu,
        .Thaana => .Thaana,
        .Thai => .Thai,
        .Tibetan => .Tibetan,
        .Tifinagh => .Tifinagh,
        .Tirhuta => .Tirhuta,
        .Todhri => .Todhri,
        .Toto => .Toto,
        .Tulu_Tigalari => .Tulu_Tigalari,
        .Ugaritic => .Ugaritic,
        .Vai => .Vai,
        .Vithkuqi => .Vithkuqi,
        .Wancho => .Wancho,
        .Warang_Citi => .Warang_Citi,
        .Yezidi => .Yezidi,
        .Yi => .Yi,
        .Zanabazar_Square => .Zanabazar_Square,
    };
}