// demo_tty.m —— **彩色控制台**示范（Objective-C）
// demo_tty.m — a **colored console** demo (Objective-C)
//
// 四层示范的第二层：清屏 + 设前景/背景色 + 定位光标 + 打印彩色文字，正常结束。
// Layer 2 of the four-layer demo: clear screen + set fg/bg colors + position the cursor + print colored text, terminating normally.
//
// ◆ 为什么直接发 ANSI，而不是用 `#include <conio.h>`
// ◆ Why it emits ANSI directly instead of using `#include <conio.h>`
//
// `Lib/c/conio.h` 能被 ObjC 前端**解析**（它没有 hex 字面量，不像 `graphics.h`），
// `Lib/c/conio.h` **can be parsed** by the ObjC frontend (it has no hex literals, unlike `graphics.h`),
// 头文件里的 `#param lib("conio")` 也会被预处理器收下 —— 但**符号解不开**：
// and the header's `#param lib("conio")` is accepted by the preprocessor — but **the symbols cannot be resolved**:
//   · `clrscr` 这类名字不在 `SharedPrefixMap` 里 ⇒ `AutoDetectSharedLibs` 想不到 conio；
//   · Names like `clrscr` are not in `SharedPrefixMap` ⇒ `AutoDetectSharedLibs` never thinks of conio;
//   · 显式 `#param lib("conio")` + 直接调 `clrscr()`，实测报「未定义的函数 'clrscr'」，
//   · With an explicit `#param lib("conio")` plus a direct `clrscr()` call, the measured result is "undefined function 'clrscr'",
//     而链接日志里**根本没有 conio.vml**。
//     and the link log shows **no conio.vml at all**.
// ⇒ 直接产出真终端会产出的字节，与 `Examples/c/conio_screen.c` 在命令行页上走**同一条
// ⇒ It emits the same bytes a real terminal would, going **through the same
//    渲染链**（`AnsiMarkup`）。
//    render chain** as `Examples/c/conio_screen.c` on the command-line page (`AnsiMarkup`).
//
// ◆ 写法（ObjC 前端的优势）
// ◆ Style (advantages of the ObjC frontend)
//
//   · **`\x1b` 转义是解析的**（与 Rust/Go 相反）⇒ 整条转义序列可以直接写进字符串；
//   · **The `\x1b` escape is parsed** (unlike Rust/Go) ⇒ a whole escape sequence can be written straight into the string;
//   · `printf` 不补换行（`puts` 补）⇒ 一行一条 CSI，换行自己写在末尾。
//   · `printf` adds no newline (`puts` does) ⇒ one CSI per line, with the newline written at the end yourself.
//   · `ui_scr_get_language()` 来自 `Lib/c/vml_ui.h`，本文件**显式引用**它（`#import`，`#include` 等价）。
//   · `ui_scr_get_language()` comes from `Lib/c/vml_ui.h`, which this file **references explicitly** (`#import`; `#include` is equivalent).
//
// 跑法：命令行页输入  vml run examples/objc/demo_tty.m
// How to run: on the command-line page type  vml run examples/objc/demo_tty.m

#include <vml_ui.h>
#import <vml_ui.h>

int main() {
    int lang;
    lang = ui_scr_get_language();

    printf("\x1b[2J\n");
    printf("\x1b[H\n");
    printf("\x1b[0;1;44;97m\n");
    if (lang == 0) printf("\x1b[3;1H  === Dolaima 彩色控制台演示 (Objective-C)  ===\n");
    else printf("\x1b[3;1H  === Dolaima color console demo (Objective-C)  ===\n");
    printf("\x1b[0;37m\n");
    if (lang == 0) printf("\x1b[5;1H标准 8 色前景（30-37）：\n");
    else printf("\x1b[5;1HStandard 8 foreground colors (30-37):\n");
    printf("\x1b[0;30m\n");
    if (lang == 0) printf("\x1b[6;1H  30 黑\n");
    else printf("\x1b[6;1H  30 black\n");
    printf("\x1b[0;31m\n");
    if (lang == 0) printf("\x1b[7;1H  31 红\n");
    else printf("\x1b[7;1H  31 red\n");
    printf("\x1b[0;32m\n");
    if (lang == 0) printf("\x1b[8;1H  32 绿\n");
    else printf("\x1b[8;1H  32 green\n");
    printf("\x1b[0;33m\n");
    if (lang == 0) printf("\x1b[9;1H  33 黄\n");
    else printf("\x1b[9;1H  33 yellow\n");
    printf("\x1b[0;34m\n");
    if (lang == 0) printf("\x1b[10;1H  34 蓝\n");
    else printf("\x1b[10;1H  34 blue\n");
    printf("\x1b[0;35m\n");
    if (lang == 0) printf("\x1b[11;1H  35 品红\n");
    else printf("\x1b[11;1H  35 magenta\n");
    printf("\x1b[0;36m\n");
    if (lang == 0) printf("\x1b[12;1H  36 青\n");
    else printf("\x1b[12;1H  36 cyan\n");
    printf("\x1b[0;37m\n");
    if (lang == 0) printf("\x1b[13;1H  37 白\n");
    else printf("\x1b[13;1H  37 white\n");
    printf("\x1b[0;37m\n");
    if (lang == 0) printf("\x1b[15;1H亮色前景（90-97）与背景色：\n");
    else printf("\x1b[15;1HBright foreground (90-97) and background colors:\n");
    printf("\x1b[0;91m\n");
    if (lang == 0) printf("\x1b[16;1H  91 亮红\n");
    else printf("\x1b[16;1H  91 bright red\n");
    printf("\x1b[0;92m\n");
    if (lang == 0) printf("\x1b[17;1H  92 亮绿\n");
    else printf("\x1b[17;1H  92 bright green\n");
    printf("\x1b[0;41m\n");
    if (lang == 0) printf("\x1b[18;1H  41 红底\n");
    else printf("\x1b[18;1H  41 red bg\n");
    printf("\x1b[0;104m\n");
    if (lang == 0) printf("\x1b[19;1H 104 亮蓝底\n");
    else printf("\x1b[19;1H 104 bright blue bg\n");
    printf("\x1b[0;103m\n");
    if (lang == 0) printf("\x1b[20;1H 103 亮黄底\n");
    else printf("\x1b[20;1H 103 bright yellow bg\n");
    printf("\x1b[0;37m\n");
    if (lang == 0) printf("\x1b[22;1H256 色（38;5;N）与真彩（38;2;r;g;b）：\n");
    else printf("\x1b[22;1H256-color (38;5;N) and truecolor (38;2;r;g;b):\n");
    printf("\x1b[0;38;5;208m\n");
    if (lang == 0) printf("\x1b[23;1H  256-208 橙\n");
    else printf("\x1b[23;1H  256-208 orange\n");
    printf("\x1b[0;38;5;46m\n");
    if (lang == 0) printf("\x1b[24;1H  256-46 亮绿\n");
    else printf("\x1b[24;1H  256-46 bright green\n");
    printf("\x1b[0;38;2;255;128;0m\n");
    if (lang == 0) printf("\x1b[25;1H  真彩 橙\n");
    else printf("\x1b[25;1H  truecolor orange\n");
    printf("\x1b[0;38;2;0;200;255m\n");
    if (lang == 0) printf("\x1b[26;1H  真彩 青\n");
    else printf("\x1b[26;1H  truecolor cyan\n");
    printf("\x1b[0;36m\n");
    if (lang == 0) printf("\x1b[28;1H光标定位（把光标移到第 30 行第 5 列）+ 画框：\n");
    else printf("\x1b[28;1HCursor positioning (move the cursor to row 30, column 5) + draw a box:\n");
    printf("\x1b[30;5H+----------------+\n");
    if (lang == 0) printf("\x1b[31;5H|  定位画框      |\n");
    else printf("\x1b[31;5H|  located box   |\n");
    printf("\x1b[32;5H+----------------+\n");
    printf("\x1b[0;2m\n");
    if (lang == 0) printf("\x1b[34;1H（以上全部是 ANSI SGR 序列，由终端 / 命令行页的 AnsiMarkup 渲染）\n");
    else printf("\x1b[34;1H(all of the above are ANSI SGR sequences, rendered by the terminal / AnsiMarkup on the command-line page)\n");
    printf("\x1b[0;32m\n");
    if (lang == 0) printf("\x1b[36;1H结束 —— 正常退出\n");
    else printf("\x1b[36;1Hdone -- exiting normally\n");
    return 0;
}
