#include "base/base_core.h"
#include "base/base_arena.h"
#include "window/window.h"
#include "render/render.h"
#include "font/font.h"
#include "draw/draw.h"

#include "render/render.c"
#include "window/window.c"
#include "font/font.c"
#include "font/font_shaper.c"
#include "font/font_provider.c"
#include "draw/draw.c"

internal String test_strings[13];

internal void
program_entry_point(void) {
    w_create(0, 0, "output");

    r_init(w_state.width, w_state.width, 4);
    font_init();

    String exe_path  = os_get_path_of_running_executable();
    String base_path = s_path_strip_filename(exe_path);
    assert(s_valid(base_path));

    s32         font_size = 32;
    Font_Face  *font[] = {
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansEgyptianHieroglyphs-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansImperialAramaic-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansKannada-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansLao-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansLinearB-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansMalayalam-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansMath-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansMongolian-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansMyanmar-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansOgham-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansOriya-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansRunic-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansTamil-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansTelugu-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansThai-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansTibetan-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansEthiopic-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansGeorgian-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansGujarati-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansGurmukhi-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansHebrew-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansAdlam-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansArmenian-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansBengali-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansCuneiform-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansDevanagari-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansCjk-Regular.otf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansArabic-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoMusic-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoColorEmoji-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansSymbols2-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSansSymbols-Regular.ttf", S_ARG(base_path))),
        font_from_path(s_tprintf(S_FMT "/../res/fonts/NotoSans-Regular.ttf", S_ARG(base_path))),
    };

    Font_Stack fonts = array_view_from_static(font);

    while (!w_state.should_close) {
        arena_reset(&context_arena);
        w_poll_events(false);
        w_begin_frame();
        r_begin_frame(w_state.width, w_state.height);
        r_state.clear_color = (Vector4) {0.1f,0.14f,0.18f,1.0f};

        font_frame();

        if (w_key_pressed(W_Key_Q, W_ModFlags_CTRL, true))  w_state.should_close = true;

        if (w_state.resized_last_frame) {
            r_state.width  = (s32) w_state.width;
            r_state.height = (s32) w_state.height;
            r_state.projection_matrix = matrix4_orthographic_projection(0, (f32) r_state.width, (f32) r_state.height, 0, -1, 1);
        }

        if (w_key_pressed_or_repeated(W_Key_EQUAL, W_ModFlags_CTRL, true)) {
            font_size++;
            font_reset();
        }

        if (w_key_pressed_or_repeated(W_Key_MINUS, W_ModFlags_CTRL, true) && font_size > 2) {
            font_size--;
            font_reset();
        }

        local_persist s32 index = 0;
        if (w_key_pressed(W_Key_N, W_ModFlags_CTRL, true))  index += 1;
        if (w_key_pressed(W_Key_B, W_ModFlags_CTRL, true))  index -= 1;
        index = (s32) ((u32) index % 13);

        Rng2f32 text_box = { 5, 10, (f32) r_state.width / 2 - 5, (f32) r_state.height - 25 };
        Vector4 box_tint = { 0.5f, 0.5f, 0.5f, 0.5f };
        draw_rect(text_box, (Rect) {0,0,1,1}, box_tint, box_tint, box_tint, box_tint, NULL);

        Font_ShapedText shaped = font_shape_text(fonts, test_strings[index], 0, 0);
        Font_Metrics   metrics = font_metrics(array_at(&fonts, 0), font_size);

        r_clip_push(text_box);
        for (f32 y = text_box.y0 + metrics.line_height; y < text_box.y1; y += metrics.line_height) {
            draw_line((Vector2) { text_box.x0, y }, (Vector2) { text_box.x1, y }, 1, Vector4_LightGray, Vector4_LightGray);
        }
        draw_shaped_text(shaped, metrics, font_size, text_box, Vector4_White);
        r_clip_pop();

        Font_Atlas *atlases[2] = { &font_state.atlas_simple, &font_state.atlas_color };
        s32 page_count = atlases[0]->pages.count + atlases[1]->pages.count;

        local_persist s32 page_index = 0;
        if (w_key_pressed(W_Key_N, W_ModFlags_CTRL | W_ModFlags_SHIFT, true))  page_index += 1;
        if (w_key_pressed(W_Key_B, W_ModFlags_CTRL | W_ModFlags_SHIFT, true))  page_index -= 1;
        page_index = page_index % page_count;

        if (page_count) {
            s32 index = page_index;
            Font_Atlas *atlas;
            array_static_for (atlases) {
                atlas = *it.at;
                if (index >= atlas->pages.count) {
                    index -= atlas->pages.count;
                    continue;
                }
                break;
            }

            Font_AtlasPage *page = &array_at(&atlas->pages, index);

            Vec2s32 page_size = { page->size.h, page->size.h }; // r_texture_get_size(page->texture);
            Rect    page_rect = { text_box.x1, text_box.y0 };
            page_rect.x1 = page_rect.x0 + page_size.x;
            page_rect.y1 = page_rect.y0 + page_size.y;

            // draw_rect(page_rect, (Rect) {0,0,1,1}, Vector4_White, Vector4_White, Vector4_White, Vector4_White, &page->texture);
            {
                R_Vertex_Text *p = r_text_push(page->texture, NULL);
                p->dst = page_rect;
                p->src = (Rect) {0,0,1,1};
                p->color = Vector4_White;
            }

            local_persist FloatSmoother sh_state = {0}, run_state = {0}, text_state = {0};

            s32 sh_count   = (s32) f64_round(float_smoother(&sh_state, (f64) font_state.shaper_table.count));
            s32 run_count  = (s32) f64_round(float_smoother(&run_state, (f64) font_state.run_table.count));
            s32 text_count = (s32) f64_round(float_smoother(&text_state, (f64) font_state.text_table.count));
            draw_text2(s_tprintf("shapers: %i\nruns: %i\ntext: %i", sh_count, run_count, text_count),
                       fonts, 20, (Rng2f32) {page_rect.x0, page_rect.y1, F32_MAX, F32_MAX}, Vector4_White);

        }

        draw_text2(s_tprintf("FPS: %i, frame: %f, page: %i / %i", w_smooth_fps(), w_state.last_frame_time, page_index, page_count),
                   fonts, 20, (Rng2f32) {5, r_state.height - 25.f, F32_MAX, F32_MAX}, Vector4_White);

        r_end_frame();
        w_end_frame();
    }

    font_deinit();
    r_deinit();
    w_destroy();
}


internal String test_strings[] = {
    // Latin / Greek / Cyrillic
    s_init(
        "Latin: The quick brown fox jumps over the lazy dog. 0123456789\n"
        "ÀÁÂÃÄÅ ÈÉÊË ÌÍÎÏ ÒÓÔÕÖ ÙÚÛÜ Ýÿ Ææ Œœ Øø Ðð Þþ ß Łł Đđ Ğğ İı Şş Ǆǅǆ\n"
        "Vietnamese: Tiếng Việt: ắ ằ ẳ ẵ ặ ế ề ể ễ ệ ố ồ ổ ỗ ộ ứ ừ ử ữ ự ỳ ỷ ỹ ỵ\n"
        "Ligatures: fi fl ff ffi ffl fj -> => != <= >= == === ... -- ---\n"
        "Combining: e\u0301 o\u0308 a\u030A n\u0303 u\u0304 a\u0323\u0302 o\u031B\u0309 x\u0361y\n"
        "Greek: Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία. Ὁ ἄνθρωπος ἐγεννήθη ἐλεύθερος.\n"
        "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ αβγδεζηθικλμνξοπρσςτυφχψω ά έ ή ί ό ύ ώ ΐ ΰ\n"
        "Cyrillic: Съешь же ещё этих мягких французских булок, да выпей чаю.\n"
        "Ђ Ѓ Є Љ Њ Ћ Џ Ґ Ў Ӏ Ѣ Ѵ Ӂ Җ Ҙ Ӯ Ә Ө\n"
    ),

    // CJK
    s_init(
        "Chinese (Simplified): 人人生而自由，在尊严和权利上一律平等。他们赋有理性和良心，并应以兄弟关系的精神相对待。\n"
        "Chinese (Traditional): 人人生而自由，在尊嚴和權利上一律平等。臺灣、香港、繁體中文、鑰、龍、鷹、齒\n"
        "Japanese: 人間は、生まれながらにして自由であり、かつ、尊厳と権利とについて平等である。\n"
        "吾輩は猫である。名前はまだ無い。いろはにほへと ちりぬるを わかよたれそ つねならむ\n"
        "ひらがな: あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも やゆよ らりるれろ わゐゑをん\n"
        "カタカナ: アイウエオ カキクケコ サシスセソ タチツテト ナニヌネノ ハヒフヘホ マミムメモ ヤユヨ ラリルレロ ワヰヱヲン ヴ ー\n"
        "Halfwidth: ｱｲｳｴｵ ｶﾞｷﾞｸﾞ ﾊﾟﾋﾟﾌﾟ  Fullwidth: ＡＢＣ ａｂｃ １２３ ！？\n"
        "Punctuation: 「こんにちは」『世界』（括弧）【見出し】《书名》〈〉、。・…～〜—\n"
        "Korean: 모든 인간은 태어날 때부터 자유로우며 그 존엄과 권리에 있어 평등하다.\n"
        "가나다라마바사 아자차카타파하 각 낡 닭 읊 뷁 쀍 ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ ㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ\n"
        "Mixed: 日本語とEnglishと한국어と中文が混在しています 2026年10月26日\n"
    ),

    // Arabic script
    s_init(
        "Arabic: يولد جميع الناس أحراراً متساوين في الكرامة والحقوق. وقد وهبوا عقلاً وضميراً.\n"
        "Diacritics: الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ ﴿١﴾ الرَّحْمَٰنِ الرَّحِيمِ ﴿٢﴾\n"
        "Digits: ٠١٢٣٤٥٦٧٨٩ ۰۱۲۳۴۵۶۷۸۹ (Arabic-Indic / Extended)\n"
        "Persian: همه افراد بشر آزاد به دنیا می‌آیند و از لحاظ حیثیت و حقوق با هم برابرند.\n"
        "مرغ همسایه غاز است. گچ پژ چ گ ک ی ی ‌ می‌دوند نیم‌فاصله\n"
        "Urdu: تمام انسان آزاد اور حقوق و عزت کے اعتبار سے برابر پیدا ہوئے ہیں۔ ٹ ڈ ڑ ں ے ھ ہ ۂ ۓ\n"
        "Lam-alef: لا لأ لإ لآ لله لَا لِإ لَآ  Joining: بببب ححح ععع ككك ههه سسس\n"
        "Kashida: ـــ بـــــسم ـــ  Forms: ع عـ ـعـ ـع  غ غـ ـغـ ـغ\n"
        "Punctuation: ، ؛ ؟ ۔ ٪ ٫ ٬ ﷲ ﷽ ﷺ ۞ ۩\n"
        "Numbers in RTL: في عام 2026 كان هناك 12345 طالباً و 3.14 نقطة.\n"
    ),

    // Hebrew + bidi
    s_init(
        "Hebrew: כל בני האדם נולדו בני חורין ושווים בערכם ובזכויותיהם. הם חונו בתבונה ובמצפון.\n"
        "Niqqud: בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ׃\n"
        "שְׁמַ֖ע יִשְׂרָאֵ֑ל יְהוָ֥ה אֱלֹהֵ֖ינוּ יְהוָ֥ה ׀ אֶחָֽד׃\n"
        "Final forms: ך כ ם מ ן נ ף פ ץ צ  Ligature: ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ  ײַ ײ װ ױ\n"
        "Gershayim: שנת תשע״ו, דף קכ״ב ע״ב. צה״ל ג׳ ז׳\n"
        "Numbers: 1234567890 (א) [ב] {ג} - 3.14%\n"
        "Bidi: Hello שלום world עולם 123 and مرحبا back to English.\n"
        "Bidi: שלום Hello עולם World 2026 שלום (parens) [brackets] <angle>\n"
        "Bidi: The word \"שלום\" means peace; \"سلام\" too. Price: ₪100 / $50 / €40\n"
    ),

    // Adlam
    s_init(
        "Adlam capitals:\n𞤀 𞤁 𞤂 𞤃 𞤄 𞤅 𞤆 𞤇 𞤈 𞤉 𞤊 𞤋 𞤌 𞤍 𞤎 𞤏 𞤐 𞤑 𞤒 𞤓 𞤔 𞤕 𞤖 𞤗 𞤘 𞤙 𞤚 𞤛 𞤜 𞤝 𞤞 𞤟 𞤠 𞤡\n"
        "Adlam lowercase:\n𞤢 𞤣 𞤤 𞤥 𞤦 𞤧 𞤨 𞤩 𞤪 𞤫 𞤬 𞤭 𞤮 𞤯 𞤰 𞤱 𞤲 𞤳 𞤴 𞤵 𞤶 𞤷 𞤸 𞤹 𞤺 𞤻 𞤼 𞤽 𞤾 𞤿 𞥀 𞥁 𞥂 𞥃\n"
        "Adlam digits: 𞥐 𞥑 𞥒 𞥓 𞥔 𞥕 𞥖 𞥗 𞥘 𞥙\n"
        "Adlam text: 𞤀𞤤𞤤𞤢𞤱 𞤢𞤲𞤲𞤭 𞤯𞤫𞤴𞤲𞤮 𞤶𞤢𞤲𞤺𞤮 - 𞤐𞤢𞤲𞥆𞤣𞤫 𞤃𞤫𞥅𞤯𞤮 𞤊𞤵𞤤𞤣𞤫\n"
        "Nukta: 𞥄 𞥅 𞥆 𞥇 𞥈 𞥉 𞥊 𞥋\n"
        "Marks: 𞤀𞥄 𞤁𞥅 𞤂𞥆 𞤃𞥇 𞤄𞥈 𞤅𞥉  Punct: 𞥞 𞥟\n"
    ),

    // Armenian + Georgian
    s_init(
        "Armenian: Բոլոր մարդիկ ծնվում են ազատ և հավասար իրենց արժանապատվությամբ և իրավունքներով։\n"
        "Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ\nա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ\n"
        "Ligatures: ﬓ ﬔ ﬕ ﬖ ﬗ և  Punct: ՜ ՝ ՞ ՚ ՛ ՟ ։ ֊ ՙ\n"
        "Georgian: ყველა ადამიანი იბადება თავისუფალი და თანასწორი თავისი ღირსებითა და უფლებებით.\n"
        "Mkhedruli: ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჷ ჸ ჹ ჺ\n"
        "Mtavruli: Ა Ბ Გ Დ Ე Ვ Ზ Თ Ი Კ Ლ Მ Ნ Ო Პ Ჟ Რ Ს Ტ Უ Ფ Ქ Ღ Ყ Შ Ჩ Ც Ძ Წ Ჭ Ხ Ჯ Ჰ Ჱ Ჲ Ჳ Ჴ Ჵ Ჶ Ჷ Ჸ Ჹ Ჺ\n"
        "Mixed: ᲑᲐᲙᲣ ბაკუ, ᲗᲑᲘᲚᲘᲡᲘ თბილისი  Nuskhuri: ⴀ ⴁ ⴂ ⴃ  Asomtavruli: Ⴀ Ⴁ Ⴂ Ⴃ\n"
    ),

    // Indic A: Devanagari, Bengali, Gujarati, Gurmukhi
    s_init(
        "Devanagari: सभी मनुष्यों को गौरव और अधिकारों के मामले में जन्मजात स्वतन्त्रता और समानता प्राप्त है।\n"
        "Conjuncts: क्ष त्र ज्ञ श्र द्य द्व क्क क्त न्न ह्म ट्ट स्त्र त्स्न र्क्य कर्त्ता प्रार्थना क्रिया पुस्तक\n"
        "Matras: कि की कु कू के कै को कौ कं कः कँ ऋ ॠ ऌ ॡ ऑ ॉ ॅ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॐ ।॥ ०१२३४५६७८९\n"
        "Reph: र्क र्ग र्म र्त्र धर्म कार्य सर्वत्र\n"
        "Bengali: সমস্ত মানুষ স্বাধীনভাবে সমান মর্যাদা এবং অধিকার নিয়ে জন্মগ্রহণ করে।\n"
        "Conjuncts: ক্ষ জ্ঞ ন্ত স্ত্র ঙ্ক ঙ্গ ন্দ ম্ব ল্ল ক্ত দ্ব র‍্য ব্য ত্‍ ৎ ং ঃ ঁ ০১২৩৪৫৬৭৮৯ ৺৻\n"
        "Gujarati: બધા માનવો જન્મથી સ્વતંત્ર છે અને ગૌરવ તથા અધિકારોની દૃષ્ટિએ સમાન છે.\n"
        "ક્ષ જ્ઞ ત્ર શ્ર દ્ય ક્ક સ્ત્ર ર્ક ઋ ૠ ઑ ઓ ૐ ં ઃ ઁ ૦૧૨૩૪૫૬૭૮૯\n"
        "Gurmukhi: ਸਾਰੇ ਇਨਸਾਨ ਆਜ਼ਾਦ ਪੈਦਾ ਹੋਏ ਹਨ ਅਤੇ ਮਾਣ ਅਤੇ ਹੱਕਾਂ ਵਿੱਚ ਬਰਾਬਰ ਹਨ।\n"
        "ਕ੍ਰ ਪ੍ਰ ਸ੍ਵ ਹ੍ਮ ਕਿ ਕੀ ਕੁ ਕੂ ਕੇ ਕੈ ਕੋ ਕੌ ਕਂ ਕੱ ਕੰ ਸ਼ ਖ਼ ਗ਼ ਜ਼ ਫ਼ ੴ ੦੧੨੩੪੫੬੭੮੯\n"
    ),

    // Indic B: Oriya, Tamil, Telugu, Kannada, Malayalam
    s_init(
        "Oriya: ସମସ୍ତ ମନୁଷ୍ୟ ଜନ୍ମକାଳରୁ ସ୍ୱାଧୀନ ଏବଂ ମର୍ଯ୍ୟାଦା ଓ ଅଧିକାରରେ ସମାନ।\n"
        "କ୍ଷ ଜ୍ଞ କ୍ର ସ୍ତ ନ୍ଦ ଣ୍ଟ କି କୀ କୁ କୂ କୃ କେ କୈ କୋ କୌ କଂ କଃ କଁ ୟ ଡ଼ ଢ଼ ୱ ୦୧୨୩୪୫୬୭୮୯\n"
        "Tamil: மனிதப் பிறவியினர் சகலரும் சுதந்திரமாகவே பிறக்கின்றனர்; அவர்கள் மதிப்பிலும் உரிமைகளிலும் சமமானவர்கள்.\n"
        "க கா கி கீ கு கூ கெ கே கை கொ கோ கௌ க் ஸ்ரீ க்ஷ ஜ ஷ ஸ ஹ ஶ்ரீ ௦௧௨௩௪௫௬௭௮௯ ௐ ௹ ௺\n"
        "Telugu: ప్రతి మనిషి స్వేచ్ఛగా, గౌరవంలో మరియు హక్కులలో సమానంగా జన్మిస్తాడు.\n"
        "క్ష జ్ఞ క్ర స్త్ర న్న ట్ట క్క కి కీ కు కూ కృ కె కే కై కొ కో కౌ కం కః కఁ ౦౧౨౩౪౫౬౭౮౯\n"
        "Kannada: ಎಲ್ಲಾ ಮಾನವರೂ ಸ್ವತಂತ್ರರಾಗಿಯೇ ಜನಿಸಿದ್ದಾರೆ ಮತ್ತು ಘನತೆ ಹಾಗೂ ಹಕ್ಕುಗಳಲ್ಲಿ ಸಮಾನರಾಗಿದ್ದಾರೆ.\n"
        "ಕ್ಷ ಜ್ಞ ಕ್ರ ಸ್ತ್ರ ನ್ನ ಟ್ಟ ಕ್ಕ ಕಿ ಕೀ ಕು ಕೂ ಕೃ ಕೆ ಕೇ ಕೈ ಕೊ ಕೋ ಕೌ ಕಂ ಕಃ ೦೧೨೩೪೫೬೭೮೯ ಱ ೞ\n"
        "Malayalam: മനുഷ്യരെല്ലാവരും തുല്യാവകാശങ്ങളോടും അന്തസ്സോടും കൂടി സ്വതന്ത്രരായി ജനിച്ചിരിക്കുന്നു.\n"
        "ക്ഷ ജ്ഞ ക്ക ന്ന ണ്ണ ക്ര സ്ത്ര ന്റ ൻ ൽ ൾ ർ ൺ ൿ ക കാ കി കീ കു കൂ കൃ കെ കേ കൈ കൊ കോ കൗ ം ഃ ൦൧൨൩൪൫൬൭൮൯\n"
    ),

    // Southeast Asian + Tibetan: Thai, Lao, Myanmar, Tibetan
    s_init(
        "Thai: มนุษย์ทั้งหลายเกิดมามีอิสระและเสมอภาคกันในเกียรติศักดิ์และสิทธิ\n"
        "ปู่ฝากผีให้ปลากับหมู กี่ กิ๊ ก็ ก้ำ ก๋า ปั๊ม ผู้ ผี่ นี้ ก๊ก ป่า ฟ้า ฎ ฏ ญ ฐ ฬ ฤ ฦ ๏ ๚ ๛ ๐๑๒๓๔๕๖๗๘๙ ๆ ฯ\n"
        "Wrap: ภาษาไทยไม่มีการเว้นวรรคระหว่างคำดังนั้นการตัดคำจึงเป็นเรื่องสำคัญในการแสดงผลข้อความ\n"
        "Lao: ມະນຸດທຸກຄົນເກີດມາມີເສລີພາບ ແລະ ເທົ່າທຽມກັນໃນກຽດສັກສີ ແລະ ສິດທິ.\n"
        "ກ ຂ ຄ ງ ຈ ສ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ຫ ອ ຮ ໆ ໜ ໝ ກິ ກີ ກຶ ກື ກຸ ກູ ກົ ກ່ ກ້ ກ໊ ກ໋ ໐໑໒໓໔໕໖໗໘໙\n"
        "Myanmar: လူသားအားလုံးသည် မွေးရာပါလွတ်လပ်၍ ဂုဏ်သိက္ခာနှင့် အခွင့်အရေးများတွင် တန်းတူညီမျှကြသည်။\n"
        "မြန်မာနိုင်ငံတော် သင်္ဘော ဉာဏ် ဒုက္ခ သစ္စာ ကမ္ဘာ မင်္ဂလာ ဥက္ကဋ္ဌ ၁၂၃၄၅၆၇၈၉၀ ၌ ၍ ၎င်း ၏ ဣ ဤ ဥ ဦ ဧ ဩ ဪ\n"
        "Tibetan: བཀྲ་ཤིས་བདེ་ལེགས། རྒྱལ་ཁབ་ཀྱི་མི་སྒེར་རྣམས་རང་དབང་དང་འཇིག་རྟེན་གྱི་ཐོབ་ཐང་ལ་འདྲ་མཉམ་ཡིན།\n"
        "Stacks: རྒྱ ཀྵ སྐྱ བསྒྲུབས བརྒྱད ཧཱུྃ ༀ ༄༅། ཀ ཁ ག ང ཅ ཆ ཇ ཉ ཏ ཐ ད ན པ ཕ བ མ ཙ ཚ ཛ ཝ ཞ ཟ འ ཡ ར ལ ཤ ས ཧ ཨ ༠༡༢༣༤༥༦༧༨༩\n"
    ),

    // Ethiopic + Mongolian
    s_init(
        "Amharic: የሰው ልጅ ሁሉ ሲወለድ ነጻ ሆኖ ነው፤ በክብርና በመብትም እኩልነት አለው።\n"
        "ሀ ሁ ሂ ሃ ሄ ህ ሆ  ለ ሉ ሊ ላ ሌ ል ሎ  ሐ ሑ ሒ ሓ ሔ ሕ ሖ  መ ሙ ሚ ማ ሜ ም ሞ  ሠ ሡ ሢ ሣ ሤ ሥ ሦ  ረ ሩ ሪ ራ ሬ ር ሮ\n"
        "Tigrinya: ኩሉ ሰብ ብነጻነት ኢዩ ዝተወልደ። ሸ ቀ ቐ ቨ ኀ ኸ ዐ ጠ ጨ ጰ ጸ ፀ ፈ ፐ ኧ ዀ ጐ ኰ ቍ ኵ ጕ ፡ ። ፣ ፤ ፥ ፦ ፧ ፨ ፩፪፫፬፭፮፯፰፱፲፳፻\n"
        "Mongolian (Cyrillic): Хүн бүр төрж мэндлэхдээ эрх чөлөөтэй, нэр төр, эрх нь адилхан байдаг.\n"
        "Өө Үү Ёё Щщ Ъъ Ыы Ьь Ээ Юю Яя\n"
        "Mongolian (traditional): ᠬᠦᠮᠦᠨ ᠪᠦᠷ ᠲᠥᠷᠦᠵᠦ ᠮᠡᠨᠳᠦᠯᠡᠬᠦ ᠡᠷᠬᠡ ᠴᠢᠯᠥᠭᠡᠲᠡᠢ ᠪᠠᠶᠢᠳᠠᠭ\n"
        "ᠠ ᠡ ᠢ ᠣ ᠤ ᠥ ᠦ ᠨ ᠩ ᠪ ᠫ ᠬ ᠭ ᠮ ᠯ ᠰ ᠱ ᠲ ᠳ ᠴ ᠵ ᠶ ᠷ  FVS: ᠠ᠋ ᠠ᠌ ᠠ᠍ ᠨ᠋ ᠭ᠋ ᠭ᠌  MVS: ᠠ᠎ ᠤ᠎ ᠡ᠎\n"
        "Digits: ᠐ ᠑ ᠒ ᠓ ᠔ ᠕ ᠖ ᠗ ᠘ ᠙  Punct: ᠀ ᠁ ᠂ ᠃ ᠄ ᠅ ᠆ ᠇ ᠈ ᠉ ᠊\n"
        "Todo/Sibe/Manchu: ᠠ ᠡ ᠢ ᠣ ᠤ ᠥ ᠦ ᡀ ᡁ ᡂ ᡃ ᢀ ᢁ ᢂ ᢃ ᢄ ᢅ ᢆ\n"
    ),

    // Symbols
    s_init(
        "Arrows: ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ↩ ↪ ↺ ↻ ⟵ ⟶ ⟷ ➔ ➜ ➤ ⬅ ⬆ ⬇ ⮕\n"
        "Math: ∀ ∂ ∃ ∅ ∇ ∈ ∉ ∋ ∏ ∑ − ∓ ∕ ∘ √ ∛ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∬ ∮ ∴ ∵ ≈ ≠ ≡ ≤ ≥ ≪ ≫ ⊂ ⊃ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ⌈ ⌉ ⌊ ⌋\n"
        "Letterlike: ℂ ℍ ℕ ℙ ℚ ℝ ℤ ℵ ℶ ℏ ℓ ℘ ℜ ℑ ℃ ℉ № ™ ℠ ℗ ℮ Ω Å ⅓ ⅔ ⅛ ⅞ Ⅳ Ⅸ ⅷ ⅻ\n"
        "Math Alnum: 𝔸𝔹ℂ𝔻 𝕒𝕓𝕔𝕕 𝒜ℬ𝒞𝒟 𝓪𝓫𝓬𝓭 𝔄𝔅ℭ𝔇 𝖠𝖡𝖢𝖣 𝚊𝚋𝚌𝚍 𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡 𝛂𝛃𝛄𝛅\n"
        "Sub/Super: x² y³ H₂O CO₂ a₁ b₂ ⁿ ⁱ ⁰¹²³⁴⁵⁶⁷⁸⁹ ₀₁₂₃₄₅₆₇₈₉ ᵃᵇᶜ ₐₑₒ\n"
        "Box:\n"
        "     ┌─┬─┐ ╔═╦═╗ ╭─╮\n"
        "     │─│─│ ║═║═║ │─│\n"
        "     ├─┼─┤ ╠═╬═╣ ╰─╯\n"
        "     └─┴─┘ ╚═╩═╝ ▀▄█▌▐░▒▓ ■□▪▫▲△▶▷▼▽◀◁◆◇○◉●◐◑◢◣◤◥\n"
        "Braille: ⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚ ⡀⡁⡂⡃ ⣿⣾⣽⣻⣷⣯⣟⡿ ⠀⠁⠂⠃⠄⠅⠆⠇\n"
        "Misc: ☀ ☁ ☂ ☃ ☄ ★ ☆ ☎ ☏ ☐ ☑ ☒ ☘ ☠ ☢ ☣ ☮ ☯ ☸ ☹ ☺ ☻ ♀ ♂ ♠ ♣ ♥ ♦ ♩ ♪ ♫ ♬ ♭ ♮ ♯ ⚀⚁⚂⚃⚄⚅ ⚐ ⚑ ⚠ ⚡ ⚽ ⚾\n"
        "Dingbats: ✁ ✂ ✈ ✉ ✌ ✍ ✎ ✏ ✓ ✔ ✕ ✖ ✗ ✘ ✚ ✛ ✜ ✝ ✞ ✠ ✡ ✦ ✧ ✩ ✪ ✯ ❀ ❁ ❄ ❖ ❝ ❞ ❶ ❷ ❸ ➀ ➁ ➂ ➊ ➋ ➌\n"
        "Chess/Cards/Dominoes/Mahjong: ♔♕♖♗♘♙ ♚♛♜♝♞♟ 🂡🂱🃁🃑 🃏 🁡🁢🁣 🀀🀁🀂🀃🀄\n"
        "Technical: ⌘ ⌥ ⇧ ⌃ ⎋ ⏎ ⌫ ⌦ ⇥ ⏏ ⏩ ⏪ ⏸ ⏹ ⏺ ⌚ ⌛ ⌨ ⎈ ⏻ ⏼ ⏽ ⭘ ⏾\n"
        "Legacy Computing: 🬀🬁🬂🬃🬄🬅🬆🬇 🮀🮁🮂🮃 🯰🯱🯲🯳🯴\n"
        "Misc: ⯀ ⯁ ⯂ ⯃ ⯄ ⯅ ⯆ ⯇ ⯈ ⯊ ⯋ ⯌ ⯍ ⯎ ⯏ ⯐ ⯑  Runic: ᚠ ᚢ ᚦ ᚨ ᚱ ᚲ  Ogham: ᚁ ᚂ ᚃ ᚄ ᚅ\n"
        "Ancient: 𐀀 𐀁 𐀂 𐀃  𐡀 𐡁 𐡂  𓂸  𓀀 𓀁 𓀂 𓀃 𓁀 𓂀  𒀀 𒀁 𒀂 𒀃  𝄞 𝄢 𝅘𝅥𝅮 𝅗𝅥\n"
    ),

    // Emoji
    s_init(
        "Faces: 😀 😃 😄 😁 😆 😅 🤣 😂 🙂 🙃 😉 😊 😇 🥰 😍 🤩 😘 😋 😛 🤪 🤔 🫡 🤐 😐 😴 🥵 🥶 🤯 🥳 😎 😭 😱 😡 💀 👻 🤖\n"
        "Hands/People: 👍 👎 👌 ✌️ 🤞 🤟 🤘 👋 🙏 💪 👀 🧠 🫀 👶 🧑 👨 👩 🧓\n"
        "Skin tones: 👍🏻 👍🏼 👍🏽 👍🏾 👍🏿  🧑🏻 🧑🏽 🧑🏿 👩🏼‍🦰 👨🏾‍🦳\n"
        "ZWJ: 👨\u200d👩\u200d👧\u200d👦 👩\u200d❤\ufe0f\u200d💋\u200d👨 🧑🏿\u200d🚀 👩🏽\u200d🔬 🏳\ufe0f\u200d🌈 🏴\u200d☠\ufe0f 🐻\u200d❄\ufe0f 🧑\u200d🤝\u200d🧑 👁\ufe0f\u200d🗨\ufe0f\n"
        "Flags: 🇬🇷 🇯🇵 🇰🇷 🇨🇳 🇮🇳 🇮🇱 🇸🇦 🇪🇹 🇹🇭 🇷🇴 🇺🇸 🇬🇧 🇩🇪 🇫🇷 🇧🇷 🇦🇺 🏴󠁧󠁢󠁥󠁮󠁧󠁿 🏴󠁧󠁢󠁳󠁣󠁴󠁿 🏁 🚩\n"
        "Keycaps: 1\ufe0f\u20e3 2\ufe0f\u20e3 3\ufe0f\u20e3 #\ufe0f\u20e3 *\ufe0f\u20e3 0\ufe0f\u20e3  Variation: ❤ ❤\ufe0e ❤\ufe0f ☺ ☺\ufe0e ☺\ufe0f ✈ ✈\ufe0f ©\ufe0f ™\ufe0f\n"
        "Nature/Food: 🐶 🐱 🐭 🦊 🐻 🐼 🦁 🐙 🦋 🌸 🌳 🌍 🔥 ⭐ 🌈 ⚡ ❄ 🍎 🍕 🍔 🍣 🍜 🍺 ☕ 🎂\n"
        "Objects: 💻 📱 ⌨️ 🖱️ 💾 📷 🔒 🔑 🔧 🔨 ⚙️ 💡 📦 📁 📈 🎮 🎵 🚀 🚗 ✈️ 🏠 ⏰ 💰 🎉 ✅ ❌ ⚠️ ❓ ❗\n"
        "Inline: Hello 😀 world 🌍 text 👍🏽 more 🇬🇷 end 👨\u200d👩\u200d👧\u200d👦 done!\n"
    ),

    // Fallback stress: every script in a single line
    s_init(
        "Hello Γειά Привет Բարև გამარჯობა\n"
        "مرحبا שלום سلام 𞤢𞤤𞤢𞤲 नमस्ते নমস্কার નમસ્તે ਸਤ ਸ੍ਰੀ ਅਕਾਲ\n"
        "ନମସ୍କାର வணக்கம் నమస్కారం ನಮಸ್ಕಾರ നമസ്കാരം\n"
        "สวัสดี ສະບາຍດີ မင်္ဂလာပါ བཀྲ་ཤིས་བདེ་ལེགས ሰላም ᠰᠠᠶᠢᠨ ᠪᠠᠶᠢᠨ᠎ᠠ\n"
        "你好 こんにちは 안녕하세요 ★ ☀ → ∑ 😀 🇬🇷 👨\u200d👩\u200d👧\u200d👦\n"
        "\n"
        "Interleaved: a б α א ا क ক ก 日 한 😀 ★ a б α א ا क ক ก 日 한 😀 ★ a б α א ا क ক ก 日 한 😀 ★\n"
        "Interleaved: aбαאاকก日한😀★aбαאاকก日한😀★aбαאاকก日한😀★aбαאاকก日한😀★\n"
        "Digits: 0123456789 ٠١٢٣٤٥٦٧٨٩ ०१२३४५६७८९ ০১২৩৪৫৬৭৮৯ ๐๑๒๓๔๕๖๗๘๙ ໐໑໒໓໔໕໖໗໘໙ ၀၁၂၃၄၅၆၇၈၉ ༠༡༢༣༤༥༦༧༨༩ 𞥐𞥑𞥒𞥓𞥔𞥕𞥖𞥗𞥘𞥙\n"
        "Missing (tofu check): \uE000 \uFFFF \U0010FFFD \u2FFF\n"
    ),
};
