# -*- coding: utf-8 -*-
"""Український текст для Level 1 A12 — «Перше Різдво».

Ті самі чотири історії, що й у Level2_A12 (Захарій та Єлисавета, Марія та
Гавриїл, народження Івана, народження Ісуса), але для молодших: кегль 13 pt,
кожен рядок історії — окремий блок, завдання вплетені в текст і набрані
фірмовим кольором, без маркера `Q:`. Формулювання, які збігаються з
Level2_A12, узято звідти дослівно — брат і сестра на різних рівнях мають
читати одну й ту саму історію.

Ключі — `p<сторінка>b<блок>`, як їх дає `extract.py`. Специфікації:
    {'lines': [...]} — зберегти сітку рядків: рядок → сегменти (текст, стиль[, x])
    {'drop': True}   — тільки стерти
    None у `lines`   — рядок не набирати (його малює `POST`)

Цитати — Огієнко. Імена за Огієнком: `Захарій`, `Ангол`, `Єлисавета`,
`Гавриїл`, `Іван`, `Йосип`.

Не перекладається: бренд `bibletime`, `bes`, `www.besweb.com`, реєстраційні
дані, бокси балів, імена персонажів (B.E.S., Q, Pause, Beam), цифри коду
кольорів на малюнку стор. 3.

Мовозалежні місця, складені наново:

* стор. 2 — ім'я `John.` по крапках (60 pt) → `Іван.`;
* стор. 4 — золотий вірш по крапках (Луки 1:37). В оригіналі два рядки по
  48 pt, слово `nothing` надруковане суцільним як опора. Українською
  два рядки вкладаються при 40 pt; суцільним іде `неможливої` — найдовше
  слово вірша, тобто найважче для обведення;
* пропуски з першою літерою: `J____` → `І ___` (ІСУС), `S__ of G__` →
  `С __   Б ____` (СИН БОЖИЙ), сувій `His name is John.` → `Іван імення
  йому.` (три слова замість чотирьох, як у Level2_A12), карта `N_______`
  / `B________` → `Н ______` / `В ______` (НАЗАРЕТ / ВІФЛЕЄМ), табличка
  `no room!` → `Місця немає!`.
"""
import json
import os

import fitz

from lessons import FONTFILES, MARKS_ROW_UP, marks_bonus

TR = {}
POST = []
WIPES = []

HERE = os.path.dirname(os.path.abspath(__file__))

with open(os.path.join(HERE, 'work', 'Level1_A12', 'template.json'),
          encoding='utf-8') as _fh:
    _TPL = json.load(_fh)
IDX = {f"p{p['page']}b{b['i']}": b for p in _TPL for b in p['blocks']}

# Середина текстової колонки (56.7 … 538.6): на неї центровані всі
# самостійні речення-завдання в оригіналі («…prayed for a:», «…would be
# called:», «…find room in:»).
COL_CX = 297.65

# Золотий вірш надруковано в самому уроці, тож звіряти є що. Вірш по
# крапках малюється в `POST`, а не в `TR`, тому оголошений у `DRAWN_TEXT`.
# Луки 1:63 — слова на сувої, розбиті переносом між двома блоками; звіряється
# перша частина.
QUOTES = [
    ('вірш по крапках, стор. 4', 'Луки 1:37'),
    ('p5b3', 'Луки 1:63', 'Іван імення'),
]

# «жодної» замість Огієнкового «жадної» — правка Редактора (7 вересня 2026,
# Level2_A12 і Level3_A12, той самий вірш). Слово Редактора важливіше за
# дослівність (рішення замовника від 7 вересня 2026).
QUOTES_EDITOR = ['вірш по крапках, стор. 4']


# ══════════════════════════════════════════════════════════ помічники
def rows(key, *text_lines, s=0, right=None):
    TR[key] = {'lines': [[(t, s)] for t in text_lines]}
    if right is not None:
        TR[key]['right'] = right


def one(key, text, s=0, right=None):
    rows(key, text, s=s, right=right)


# Рядки історії на всю ширину сторінки доходять до 536 pt (там, де на
# цьому рядку немає бокса балів). Типова межа 508 — це край колонки перед
# боксами, і для 13 pt вона зайво тісна.
FULL_RIGHT = 536.0


def line(key, text, s=0):
    rows(key, text, s=s, right=FULL_RIGHT)


def col(key, text, right):
    """Рядок історії у вузькій колонці поруч із малюнком.

    Типова права межа — 508 pt (край колонки), але тут праворуч стоїть
    ілюстрація, і без явної межі довший український рядок заповз би під неї
    (§2.4, правило 1). Рядок ужимається до `MIN_SCALE`, а якщо й так не
    вкладається — `build.py` попереджає.
    """
    TR[key] = {'right': right, 'lines': [[(text, 0)]]}


def head(page, block, big=False, with_name=False):
    """Шапка сторінок: bible|time, підпис рівня, номер серії."""
    lines = []
    if with_name:
        lines.append([("Ім'я:", 0)])
    i = 1 if with_name else 0
    lines.append([('bible', i), ('time', i + 1)])
    if big:                       # обкладинка має ще й www у шапці
        lines.append([('www.besweb.com', i + 2)])
        lines.append([('Рівень 1 — біблійні історії', i + 3)])
        lines.append([('A12', i + 4)])
    else:
        lines.append([('Рівень 1 — біблійні історії', i + 2)])
        lines.append([('A12', i + 3)])
    TR[f'p{page}b{block}'] = {'lines': lines}


def story(key, n, title, s0=0, s1=1):
    TR[key] = {'lines': [[(f'ІСТОРІЯ {n}:', s0), (f' {title}', s1)]]}


# Бокс «ЧИТАЙ» намальований, і «ЧИТАЙ:» ширше за «READ:», тож рядки
# центруються на боксі й міряються по його правому краю.
READ_BOX = (471.1, 538.1)
BOX_PAD = 1.5


def read(key, ref, box=READ_BOX):
    TR[key] = {'lines': [[('ЧИТАЙ:', 0)], [(ref, 1)]],
               'center': True, 'right': box[1] - BOX_PAD}


def marks(key, text):
    """Бокс балів. Не перекладається, але ключ мусить бути."""
    TR[key] = {'lines': [[(text, 0)]]}


def centred(key, lines, style, cx, ys=None, size=None, right=None):
    """Рядки, центровані на осі `cx`: сегмент із порахованим `x`.

    `center: True` тут не годиться — воно центрує на центрі ВІДПОВІДНОГО
    оригінального спана, а англійський рядок іншої ширини й стоїть інакше.
    `None` у `lines` — рядок пропустити (стерти, нічого не набирати).
    """
    st = IDX[key]['styles'][style]
    fnt = fitz.Font(fontfile=FONTFILES[st['font']])
    size = size or st['size']
    out = []
    for i, text in enumerate(lines):
        if text is None:
            out.append(None)
            continue
        seg = (text, style, cx - fnt.text_length(text, size) / 2)
        opts = {'segs': [seg]}
        if ys:
            opts['y'] = ys[i]
        if size != st['size']:
            opts['size'] = size
        out.append(opts if len(opts) > 1 else [seg])
    TR[key] = {'lines': out}
    if right is not None:
        TR[key]['right'] = right


def boxed(key, text, box, style=0):
    """Напис, центрований у намальованій рамці (x0, x1)."""
    centred(key, [text], style, (box[0] + box[1]) / 2, right=box[1] - 1.0)


# ═══════════════════════════════════════════════════════════ сторінка 1
# «level 1» (p0b0) — білий текст на білому тлі, невидимий. І перекладати, і
# стирати його не можна: напис повернутий на 90°, і його прямокутник ковтає
# бокс балів (§2.4a, п. 3). Лишаємо блок недоторканим.
rows('p0b1', 'Впиши тут своє імʼя та адресу.', 'Вік:', "Ім'я:", 'Адреса:')
for _i, _t in ((1, 'Вік:'), (2, "Ім'я:"), (3, 'Адреса:')):
    TR['p0b1']['lines'][_i] = [(_t, 1)]
one('p0b2', 'Вчитель:')
head(0, 3, big=True)
one('p0b4', 'Рівень 1')
# Підписи під фігурками центруються під СВОЄЮ фігуркою (правило замовника
# від 3 вересня 2026): `center: True` ставить рядок на середину відповідного
# англійського спана, а той уже стоїть під фігуркою.
TR['p0b5'] = {'center': True, 'lines': [
    [('B.E.S.', 0)], [('мудрий друг', 1)],
    [('Q', 0)], [('ставить', 1)], [('запитання', 1)]]}
TR['p0b6'] = {'center': True, 'lines': [
    [('Pause', 0)], [('любить', 1)], [('подумати', 1)]]}
TR['p0b7'] = {'center': True, 'lines': [
    [('Beam', 0)], [('друг, який', 1)], [('підбадьорює', 1)]]}
story('p0b44', 1, 'Захарій та Єлисавета')
one('p0b45', 'Ця історія про те, як Бог відповідає на молитву.')
read('p0b47', 'Луки 1:5-25')

# Історія стоїть ліворуч від малюнка Захарія та Єлисавети (лівий край
# фігур ≈ 340 pt). Дев'ять рядків, як в оригіналі: чотири + п'ять.
P1_RIGHT = 325.0
for _k, _t in (
        ('p0b48', 'Захарій та його дружина Єлисавета'),
        ('p0b49', 'довго молилися Богові про дитину.'),
        ('p0b50', 'Тепер вони були старі, і здавалося,'),
        ('p0b51', 'що Єлисавета вже не зможе мати дітей.'),
        ('p0b52', 'Одного дня Захарій служив у храмі.'),
        ('p0b53', 'До нього прийшов Ангол і сказав, що'),
        ('p0b54', 'його молитву почуто і що незабаром'),
        ('p0b55', 'його дружина народить сина. Вони мали'),
        ('p0b56', "дати йому ім'я Іван.")):
    col(_k, _t, P1_RIGHT)
one('p0b57', 'Розфарбуй малюнок.')
one('p0b58', 'Обведи правильний малюнок, щоб закінчити речення:')
centred('p0b59', ['Захарій та Єлисавета молилися про:'], 0, COL_CX)
marks('p0b60', '/ 2')
marks('p0b61', '/ 4')

# ═══════════════════════════════════════════════════════════ сторінка 2
rows('p1b0', 'www.besweb.com')
one('p1b1', 'УСЬОГО:')
head(1, 2)
marks('p1b3', '/ 6')
marks('p1b4', '/ 2')
one('p1b5', 'Захарій не повірив словам Ангола. Тоді Ангол сказав, що він не зможе')
one('p1b6', 'говорити, аж поки не народиться дитина.')
one('p1b7', "З'єднай крапки.")
# Другий рядок блока — «John.» по крапках, 60 pt; малюється в `POST`.
centred('p1b8', ['Ангол сказав, що хлопчика назвуть:', None], 0, COL_CX)
one('p1b9', 'Напиши ТАК або НІ після кожного речення:')
# Рамки для відповіді починаються на x ≈ 400, тож рядок мусить скінчитися
# раніше.
YESNO_RIGHT = 395.0
for _k, _t in (('p1b10', 'Захарій служив у храмі.'),
               ('p1b11', 'Захарій повірив словам Ангола.'),
               ('p1b12', 'Захарій не міг говорити.')):
    one(_k, _t, right=YESNO_RIGHT)
one('p1b13', 'Біблія навчає, що Бог чує наші молитви й відповідає на них.')
one('p1b14', 'Намалюй у кожній фігурі щось, про що можна помолитися.')
one('p1b15', 'Дякую за:')
one('p1b16', 'Пробач мені за:')
one('p1b17', 'Люди, за яких')
one('p1b18', 'я молюся:')
marks('p1b19', '/ 6')

# ═══════════════════════════════════════════════════════════ сторінка 3
rows('p2b0', 'www.besweb.com')
head(2, 1, with_name=True)
story('p2b2', 2, 'Марія та Гавриїл')
one('p2b3', 'Ця історія про те, як Марія повірила Божому слову.')
read('p2b5', 'Луки 1:26-38')

# Історія стоїть ліворуч від ангола (ліве крило ≈ 260 pt). Вісім рядків
# і п'ять, як в оригіналі.
P3_RIGHT = 250.0
for _k, _t in (
        ('p2b6', 'Ангол Гавриїл спершу сказав'),
        ('p2b7', 'Захарію та Єлисаветі, що'),
        ('p2b8', 'в них народиться син.'),
        ('p2b9', 'Тепер Ангол мав особливу'),
        ('p2b10', 'звістку для Марії.'),
        ('p2b11', 'Марія почула, що вона теж'),
        ('p2b12', 'матиме сина і що Йому'),
        ('p2b13', "дадуть ім'я Ісус."),
        ('p2b14', 'Біблія навчає, що Син'),
        ('p2b15', 'Марії набагато більший'),
        ('p2b16', 'за сина Захарія та'),
        ('p2b17', 'Єлисавети, бо Він —'),
        ('p2b18', 'Син Божий.')):
    col(_k, _t, P3_RIGHT)

# Код кольорів лишається як є (рішення замовника від 8 вересня 2026):
# цифри на малюнку не чіпаємо, підписи перекладаємо. Другий сегмент
# першого рядка стоїть на своєму x (344.7), як і решта підписів.
TR['p2b19'] = {'lines': [[('Розфарбуй малюнок за кодом кольорів:', 0),
                          ('1 = жовтий', 0, 344.7)]]}
one('p2b20', '2 = рожевий')
one('p2b21', '3 = синій')
one('p2b22', '4 = червоний')
one('p2b23', '5 = коричневий')
one('p2b24', 'Напиши два імені Дитяти Марії.')
# Пропуски стоять у намальованих рамках; центруються на рамці.
boxed('p2b25', 'І __ __ __', (229.4, 365.9))
boxed('p2b26', 'С __ __   Б __ __ __ __', (216.4, 378.9))
marks('p2b28', '/ 5')
marks('p2b29', '/ 3')

# ═══════════════════════════════════════════════════════════ сторінка 4
rows('p3b0', 'www.besweb.com')
one('p3b1', 'УСЬОГО:')
head(3, 2)
# Праворуч — малюнки Івана та Ісуса (від ≈ 455 pt).
rows('p3b3', 'Проведи лінії від тверджень', 'до правильної особи.', right=440.0)
# Білі написи в помаранчевих плашках (57.2 … 284.9) — центруються на плашці.
MATCH_BOX = (57.2, 284.9)
boxed('p3b4', 'Син Захарія', MATCH_BOX)
boxed('p3b5', 'Більший за Івана', MATCH_BOX)
boxed('p3b6', 'Син Божий', MATCH_BOX)
boxed('p3b7', 'Він розповість людям про Ісуса', MATCH_BOX)
line('p3b8', 'Марія не розуміла, як таке може статися. Ангол сказав їй, що все')
# Рядки 2-3 блока — вірш по крапках, малюється в `POST`.
TR['p3b9'] = {'lines': [[('буде добре. Ангол сказав:', 0)], None, None]}
# `center: True`, а не `centred()`: оригінальний рядок і так центрований на
# колонці, а екранна версія (`SCREEN_TEXT`) підставляє сюди інший текст —
# порахованої координати вона не перерахувала б.
TR['p3b10'] = {'center': True,
               'lines': [[("З'єднай крапки й дочитай вірш. (Луки 1:37)", 0)]]}
for _k, _t in (
        ('p3b11', 'Марія повірила словам Ангола — не так, як Захарій, який'),
        ('p3b12', 'засумнівався! Марія була готова прийняти Божий задум і'),
        ('p3b13', "стати матір'ю цього особливого Дитяти. Біблія навчає,"),
        ('p3b14', 'що й нам треба повністю довіряти Богові.'),
        ('p3b15', 'Народження Ісуса — одне з найбільших чудес, які'),
        ('p3b16', 'будь-коли ставалися!')):
    one(_k, _t, right=542.0)      # рядки 12 pt доходять до 542
marks('p3b17', '/ 8')
marks('p3b18', '/ 4')
one('p3b19', 'Іван')
one('p3b20', 'Ісус')
# Репліка Beam у балоні — ті самі слова, що в Level2_A12.
TR['p3b28'] = {'center': True, 'lines': [
    [('Коли знаєш, що Бог', 0)], [('може робити велике,', 0)],
    [('страх відступає!', 0)]]}

# ═══════════════════════════════════════════════════════════ сторінка 5
rows('p4b0', 'www.besweb.com')
head(4, 1, with_name=True)
story('p4b2', 3, 'Народження Івана')
one('p4b3', 'Ця історія про те, як Бог дотримує Своїх обіцянок.')
read('p4b5', 'Луки 1:57-66')
line('p4b6', 'Народження дитини — завжди радісна подія. А народження сина')
line('p4b7', 'Єлисавети було особливим, бо Ангол обіцяв, що він народиться.')
line('p4b8', 'Усі рідні та сусіди прийшли подивитися на нього. Вони думали, що')
line('p4b9', 'дитину треба назвати іменем батька, але Єлисавета сказала: "Ні!"')
rows('p4b10', 'Намалюй немовля на руках у Захарія, а ще рідних і сусідів, які прийшли',
     'подивитися на нього. Розфарбуй малюнок.')
# «/ 10» ширший за свій bbox уже в оригіналі; межа — край сторінки.
TR['p4b11'] = {'right': 580.0, 'lines': [[('/ 10', 0)]]}

# ═══════════════════════════════════════════════════════════ сторінка 6
rows('p5b0', 'www.besweb.com')
one('p5b1', 'УСЬОГО:')
head(5, 2)
line('p5b3', 'Коли всі питали Захарія, як назвати дитину, він написав: "Іван імення')
line('p5b4', 'йому".')
one('p5b5', 'Що написав Захарій?')
# Напис на сувої: «Іван імення йому» (Луки 1:63) — три слова там, де в
# оригіналі чотири. Рядки сідають симетрично навколо середини первісного
# чотирирядка (249.9 … 309.9), четвертий блок стирається.
SCROLL_CX = 292.5
centred('p5b6', ['І __ __ __'], 0, SCROLL_CX, ys=[259.9])
centred('p5b7', ['і __ __ __ __ __'], 0, SCROLL_CX, ys=[279.9])
centred('p5b8', ['й __ __ __ .'], 0, SCROLL_CX, ys=[299.9])
TR['p5b9'] = {'drop': True}
line('p5b10', "Щойно Захарій написав ім'я дитини, він знову зміг говорити. Він почав")
# «здивовані», а не «вражені» — правка Редактора від 7 вересня (Level2_A12).
line('p5b11', 'прославляти Бога. Усі були здивовані з того, що сталося.')
one('p5b12', 'Проведи лінію від кожного малюнка до правильного твердження.')
line('p5b13', 'Іван виріс і став великим чоловіком, який пізніше приготував дорогу')
line('p5b14', 'для приходу Ісуса.')
marks('p5b15', '/ 4')
marks('p5b16', '/ 6')
one('p5b17', 'Захарій')
one('p5b18', 'Єлисавета')
one('p5b19', 'Іван')
STATE_BOX = (298.1, 525.9)
boxed('p5b20', 'Мати немовляти.', STATE_BOX)
boxed('p5b21', 'Бог дав йому особливе завдання.', STATE_BOX)
boxed('p5b22', 'Прославив Бога.', STATE_BOX)

# ═══════════════════════════════════════════════════════════ сторінка 7
rows('p6b0', 'www.besweb.com')
head(6, 1, with_name=True)
story('p6b2', 4, 'Народження Ісуса')
one('p6b3', 'Ця історія про те, як Бог дає Свого Сина нам за Спасителя.')
read('p6b5', 'Луки 2:1-7')
line('p6b6', 'Скоро мало народитися особливе Дитя Марії — Син Божий. Саме тоді')
line('p6b7', 'Марії та Йосипу довелося вирушити в далеку подорож із Назарета')
line('p6b8', 'до Віфлеєма. На дорозі було дуже людно.')
# Бокс балів /8 стоїть на цьому ж рядку від 509 pt.
one('p6b9', 'Підпиши Назарет і Віфлеєм та домалюй людей у подорожі.', right=505.0)
line('p6b10', 'Коли вони прийшли, то не знайшли, де спинитися. Заїзди були повні.')
line('p6b11', 'Місця не було.')
# Праворуч — малюнок містечка з табличкою (від ≈ 340 pt). Два рядки — два
# окремі блоки шаблону.
one('p6b12', 'Доповни напис, щоб показати,', right=330.0)
one('p6b13', 'що заїзди були повні.', right=330.0)
marks('p6b14', '/ 4')
marks('p6b15', '/ 8')
# Підписи на карті: НАЗАРЕТ і ВІФЛЕЄМ, по одній літері на підкреслення
# (§2.5). Українські назви коротші, тож і рисочок менше; підказка — перша
# літера, як в оригіналі. Лівий край лишається оригінальний.
one('p6b16', 'Н __ __ __ __ __ __')
one('p6b17', 'В __ __ __ __ __ __')
# Табличка «no room!» → «Місця немає!»; рядки центруються на табличці.
SIGN_CX = 415.0
centred('p6b18', ['М __ __ __ __'], 0, SIGN_CX)
centred('p6b19', ['н __ __ __ __ !'], 0, SIGN_CX)

# ═══════════════════════════════════════════════════════════ сторінка 8
TR['p7b0'] = {'lines': [[('Бали', 0), (' (вписує вчитель)', 1)]]}
for _i in range(1, 5):
    one(f'p7b{_i}', f'ІСТОРІЯ {_i}:')
# «Разом» переїжджає на порожній рядок вище; на його місце `marks_bonus()`
# домальовує «Додаткові бали» (правило від 3 вересня 2026).
TR['p7b5'] = {'lines': [{'segs': [('Разом', 0)], 'y': MARKS_ROW_UP}]}
one('p7b6', 'Загалом')
# Два підписи на спільній базовій лінії — по одному сегменту на рядок
# (§2.4, правило 2); x кожного береться з оригіналу.
# Другий підпис довший за англійський і від свого x (471.7) вийшов би за
# край сторінки, тож зсунутий ліворуч; праворуч від нього нічого немає.
TR['p7b7'] = {'right': 567.0, 'lines': [[('Коментар учителя:', 0)],
                                         [('Надішли свої уроки на адресу:', 0, 450.0)]]}
TR['p7b8'] = {'lines': [
    [('©', 0), (' Bible Educational Services. Відвідай ', 1), ('www.besweb.com', 2),
     (' або телефонуй +44 (0) 28 6632 2462.', 1)],
    [('Registered Charity UK CIO 1186004', 1)],
    [('РІВЕНЬ 1 A12', 3)],
    [('12/2025', 4)],
]}
one('p7b9', 'УСЬОГО:')
# Історія праворуч від малюнка Марії, Йосипа та Ісуса — п'ять рядків
# від 242.4 до ≈ 540, як в оригіналі.
for _k, _t in (
        ('p7b10', 'Нарешті вони знайшли, де переночувати.'),
        ('p7b11', 'Це було місце, де тримали тварин. Тут і'),
        ('p7b12', 'народився Ісус. Марія сповила Його'),
        ('p7b13', 'пелюшками й поклала в ясла, куди'),
        ('p7b14', 'зазвичай клали корм для худоби.')):
    one(_k, _t, right=542.0)
one('p7b15', 'Розфарбуй Марію, Йосипа та Ісуса.')
one('p7b16', 'Розфарбуй правильні відповіді.')
centred('p7b17', ['Марія та Йосип змогли знайти місце лише:'], 0, COL_CX)
# Варіанти відповіді — по одному в кожній намальованій рамці. В оригіналі
# це один блок із чотирма «рядками» на спільній базовій лінії, тож на
# кожен рядок рівно один сегмент, центрований у своїй рамці.
_OPT_FONT = fitz.Font(fontfile=FONTFILES['Arial-BoldMT'])


def _options(key, items):
    lines = []
    for text, (x0, x1) in items:
        x = (x0 + x1 - _OPT_FONT.text_length(text, 13.0)) / 2
        lines.append([(text, 0, x)])
    TR[key] = {'lines': lines}


_options('p7b18', [('у заїзді', (81.0, 187.8)), ('у палаці', (189.9, 296.6)),
                   ('у лікарні', (298.7, 405.4)), ('у хліві', (407.5, 514.2))])
centred('p7b19', ['Ісуса поклали:'], 0, COL_CX)
_options('p7b20', [('у ліжко', (135.4, 242.2)), ('у ясла', (244.3, 351.0)),
                   ('у колиску', (353.1, 459.8))])
# Праворуч стоїть Q (рука від ≈ 440 pt).
Q_RIGHT = 440.0
for _k, _t in (
        ('p7b21', 'Щодня у світі народжуються сотні немовлят, але такого'),
        ('p7b22', 'Немовляти не було ніколи. Християни вірять, що це'),
        ('p7b23', 'Дитя — Син Божий.'),
        ('p7b24', 'Біблія навчає, що нам треба дякувати Богові за Його'),
        ('p7b25', 'велику любов: Він послав Свого Сина у світ, щоб Той'),
        ('p7b26', 'став нашим Спасителем.')):
    one(_k, _t, right=Q_RIGHT)
marks('p7b27', '/ 4')
marks('p7b28', '/ 4')


# ═══════════════════════════════════════════════ те, що малюється
from puzzlekit import dotted_text                              # noqa: E402

ROUND = FONTFILES['SassoonInfantDtB']
_ROUND_FONT = fitz.Font(fontfile=ROUND)

# ── ім'я по крапках, стор. 2 ─────────────────────────────────────────────
NAME_TEXT, NAME_SIZE, NAME_Y = 'Іван.', 60.0, 276.7

# ── золотий вірш по крапках, стор. 4 ─────────────────────────────────────
# Луки 1:37. В Огієнка — «неможливої ЖАДНОЇ речі»; Редактор попросив
# «жодної» (див. `QUOTES_EDITOR`). Два рядки на базових лініях оригіналу;
# 40 pt замість 48 — інакше другий рядок не вкладається в колонку.
# `solid` — слово, надруковане суцільним, як `nothing` в оригіналі.
VERSE_SIZE = 40.0
VERSE_CX = 290.0
VERSE = [('"Бо для Бога нема', 479.6, None),
         ('неможливої жодної речі!"', 529.2, 'неможливої')]
DRAWN_TEXT = {'вірш по крапках, стор. 4': ' '.join(t for t, _y, _s in VERSE)}


def _dotted_line(page, text, y, solid, size, cx):
    x = cx - _ROUND_FONT.text_length(text, size) / 2
    if solid and text.startswith(solid):
        page.insert_font(fontname='uaRnd', fontfile=ROUND)
        page.insert_text((x, y), solid, fontname='uaRnd', fontsize=size,
                         color=(0, 0, 0))
        x += _ROUND_FONT.text_length(solid, size)
        text = text[len(solid):]
    return dotted_text(page, (x, y), text, 'uaDot', ROUND, size)


def _draw_puzzles(doc, only=None):
    def want(pno):
        return only is None or pno in only

    if only is None:
        marks_bonus(doc[7])           # рядок «Додаткові бали»

    if want(1):
        page = doc[1]
        x = COL_CX - _ROUND_FONT.text_length(NAME_TEXT, NAME_SIZE) / 2
        if not dotted_text(page, (x, NAME_Y), NAME_TEXT, 'uaDot', ROUND,
                           NAME_SIZE):
            print(f'  !! пунктир не застосовано до {NAME_TEXT!r}')
        print("  стор. 2: ім'я по крапках — %s" % NAME_TEXT)

    if want(3):
        page = doc[3]
        for text, y, solid in VERSE:
            if not _dotted_line(page, text, y, solid, VERSE_SIZE, VERSE_CX):
                print(f'  !! пунктир не застосовано до {text!r}')
        print('  стор. 4: золотий вірш по крапках — 2 рядки, суцільне '
              '«неможливої»')


POST.append(_draw_puzzles)


# ── праві межі абзаців (§2.4, правило 1) ─────────────────────────────────
for _k, _v in TR.items():
    if 'flow' in _v and 'right' not in _v:
        _r = IDX[_k]['bbox'][2]
        if _r < 480:
            _v['right'] = _r + 2.0


# ── навмисне зростання блоків (§1.5, клас GROW) ──────────────────────────
# Не «підіймаємо поріг», а називаємо поіменно ті блоки, де зростання —
# рішення, а не дефект:
#
#   p5b6, p5b7, p5b8 — три слова на сувої сидять симетрично навколо
#            середини первісного чотирирядка й центровані на сувої, а не
#            на англійських якорях;
#   p7b20  — варіанти відповіді центруються кожен у своїй рамці;
#            «у ліжко» ширше за «a bed» і починається лівіше.
GROW_OK = ['p5b6', 'p5b7', 'p5b8', 'p7b20']


# ═══════════════════════════════════════════════ поля, оголошені уроком
#
# «Проведи лінії від тверджень до правильної особи» (стор. 4): лінію дотиком
# поле форми не вміє. Замість неї — список вибору «Іван / Ісус» праворуч від
# кожної помаранчевої плашки з твердженням, лише в інтерактиві (запит
# Редактора від 9 вересня 2026, як у Level3_A12 стор. 5). Плашки — 57.2 …
# 284.9 pt, списки стають у вільній смузі між плашками й малюнками.
MATCH_NAMES = ['Іван', 'Ісус']
MATCH_ROWS = [(185.8, 213.1), (216.7, 244.0), (247.6, 275.0), (278.6, 305.9)]
MATCH_BOX = (292.0, 372.0)
# Те саме на стор. 6 («проведи лінію від кожного малюнка до твердження»):
# плашки 298.1 … 525.9, малюнки з підписами ліворуч до ≈ 195 pt, списки
# «Захарій / Єлисавета / Іван» у смузі між ними.
MATCH6_NAMES = ['Захарій', 'Єлисавета', 'Іван']
MATCH6_ROWS = [(544.4, 571.7), (602.6, 630.0), (660.9, 688.2)]
MATCH6_BOX = (203.0, 290.0)
EXTRA_FIELDS = [
    {'page': 3, 'task': 1, 'type': 'list',
     'rect': [MATCH_BOX[0], y0 + 3.0, MATCH_BOX[1], y1 - 3.0],
     'extra': {'values': MATCH_NAMES}}
    for y0, y1 in MATCH_ROWS
] + [
    {'page': 5, 'task': 2, 'type': 'list',
     'rect': [MATCH6_BOX[0], y0 + 3.0, MATCH6_BOX[1], y1 - 3.0],
     'extra': {'values': MATCH6_NAMES}}
    for y0, y1 in MATCH6_ROWS
]


# ═══════════════════════════════════════════════ екранна версія
# На папері дитина обводить крапки; на екрані літери стають полями-заливками
# (тип `paint`), тож інструкція інша. Друкований PDF від цього не змінюється.
SCREEN_TEXT = {
    'p1b7': 'Розфарбуй літери.',
    'p3b10': 'Розфарбуй літери вірша. (Луки 1:37)',
}

# ── гості на стор. 5, лише в інтерактиві ─────────────────────────────────
# «Намалюй рідних і сусідів, які прийшли подивитися» — на папері дитина
# малює сама, на екрані має побачити їх готовими (запит Редактора від
# 9 вересня 2026). Фігури взято з малюнків тієї самої програми, щоб стиль
# збігався: Єлисавета з цього ж буклета (стор. 1), Марія — Level1_B3
# стор. 2, самарянин — Level1_B5 стор. 2, Никодим — Level1_C3 стор. 3,
# Даниїл — Level1_C1 стор. 5. Вирізає `cut_figures.py` у
# `data/pictures/figures_A12.pdf`: сторінка на фігуру, порядок як там.
# Чоловіки стоять окремо один від одного (зауваження Редактора).
#
# Рамка малюнка 58.8 … 536.5 × 377.6 … 763.4, Захарій 229.8 … 365.5,
# ноги на 741. Двоє ліворуч, троє праворуч, усі трохи менші за Захарія —
# стоять за ним.
FIGURES_PDF = os.path.join(os.path.dirname(HERE), 'data', 'pictures',
                           'figures_A12.pdf')
VISITORS_FEET = 736.0
VISITORS = [                       # (сторінка у figures_A12.pdf, лівий x, висота)
    (0, 62.0, 268.0),              # Єлисавета
    (1, 150.0, 250.0),             # Марія
    (2, 370.0, 150.0),             # самарянин
    (3, 424.0, 156.0),             # Никодим
    (4, 490.0, 140.0),             # Даниїл
]


def _screen_visitors(doc, only=None):
    if only is not None and 4 not in only:
        return
    figs = fitz.open(FIGURES_PDF)
    page = doc[4]
    for pno, x0, h in VISITORS:
        src = figs[pno].rect
        w = src.width * h / src.height
        page.show_pdf_page(fitz.Rect(x0, VISITORS_FEET - h, x0 + w, VISITORS_FEET),
                           figs, pno)
    print('  стор. 5 (екран): гості — %d фігур' % len(VISITORS))


SCREEN_POST = [_screen_visitors]
