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

Дошкільний рівень: 4 сторінки, ті самі чотири історії, що в Level1_A12 і
Level2_A12, але тексту мало, а завдання — розфарбувати, з'єднати крапки,
провести лінію. Блоки `Adult Guidance` адресовані дорослому, який веде
заняття, і теж перекладаються (заголовок «Для дорослого»). Формулювання,
спільні з рівнями 1–2, узято звідти дослівно.

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

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

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

Мовозалежне одне: на сувої стор. 3 «His name is / John.» → «Його ім'я /
Іван.» — ім'я по крапках (72 pt) малюється в `POST`.
"""
import json
import os

import fitz

from lessons import FONTFILES, MARKS_ROW_UP, MARKS_ROW_TOTAL, marks_bonus

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

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

with open(os.path.join(HERE, 'work', 'Level0_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']}

QUOTES = []
QUOTES_EDITOR = []

# Рядки історії на всю ширину сторінки доходять до 540 pt; типова межа 508
# (край колонки перед боксами балів) для 13 pt зайво тісна.
FULL_RIGHT = 540.0


# ══════════════════════════════════════════════════════════ помічники
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)


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


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


# Бокс «ЧИТАЙ» намальований (471.1 … 538.1), «ЧИТАЙ:» ширше за «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 guidance(key, *text_lines, read=None):
    """Блок «Adult Guidance»; на стор. 2 і 4 він ділить блок із «ЧИТАЙ».

    Рядки «ЧИТАЙ:» і посилання центруються на боксі — але ця опція діє на
    весь блок, тож для них координата рахується явно (як `centred`).
    """
    lines = []
    if read:
        st = IDX[key]['styles']
        for text, si in (('ЧИТАЙ:', 0), (read, 1)):
            fnt = fitz.Font(fontfile=FONTFILES[st[si]['font']])
            cx = (READ_BOX[0] + READ_BOX[1]) / 2
            lines.append({'segs': [(text, si, cx - fnt.text_length(text, st[si]['size']) / 2)],
                          'right': READ_BOX[1] - BOX_PAD})
        head_s, body_s = 2, 3
    else:
        head_s, body_s = 0, 1
    lines.append([('Для дорослого', head_s), (' — ' + text_lines[0], body_s)])
    lines += [[(t, body_s)] for t in text_lines[1:]]
    TR[key] = {'lines': lines, 'right': 512.0}


def marks(key, text, right=580.0):
    """Бокс балів: не перекладається, ключ лишається; «/ 10» ширший за свій
    bbox уже в оригіналі, тож межа — край сторінки."""
    TR[key] = {'right': right, 'lines': [[(text, 0)]]}


def centred(key, lines, style, cx, ys=None, size=None):
    """Рядки, центровані на осі `cx`; `None` — рядок пропустити."""
    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}


# ═══════════════════════════════════════════════════════════ сторінка 1
# «level 0» (p0b2) — білий текст на білому тлі, невидимий і повернутий:
# ні перекладати, ні стирати (§2.4a, п. 3).
rows('p0b0', 'Впиши тут своє імʼя та адресу.', 'Вік:', "Ім'я:", 'Адреса:')
for _i, _t in ((1, 'Вік:'), (2, "Ім'я:"), (3, 'Адреса:')):
    TR['p0b0']['lines'][_i] = [(_t, 1)]
one('p0b1', 'Вчитель:')
TR['p0b3'] = {'lines': [
    [('bible', 0), ('time', 1)],
    [('www.besweb.com', 2)],
    [('Рівень 0 — біблійні історії', 3)],
    [('A12', 4)],
]}
one('p0b4', 'Рівень 0')
# Підписи під фігурками — під СВОЄЮ фігуркою (правило від 3 вересня 2026).
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')
marks('p0b48', '/ 10')
guidance('p0b49',
         'поговоріть із дітьми про молитву. Біблія каже, що Бог чує наші '
         'молитви й відповідає на них,',
         'хоч іноді відповіді доводиться чекати. Обережно поговоріть про те, '
         'як це — не могти говорити. Спробуйте',
         'пояснити щось кількома простими жестами й подивіться, чи зрозуміють '
         'діти.')
line('p0b50', 'Захарій був одружений з Єлисаветою. Вони хотіли мати дитину. Вони',
     'молилися про це Богові.')
line('p0b51', 'Вони старіли й думали, чи відповість Бог на їхню молитву.')
# Рядки 3–8 стоять праворуч від малюнка (x = 306.3), у ту саму ширину.
TR['p0b52'] = {'right': FULL_RIGHT, 'lines': [
    [('Одного дня Ангол сказав Захарію, що Бог дасть їм сина, якого', 0)],
    [('треба назвати Іван.', 0)],
    [('Захарій не повірив Анголові,', 0)],
    [('тому Бог зробив так, що він', 0)],
    [('не міг говорити.', 0)],
    [('Біблія навчає: коли ми', 0)],
    [('молимося, треба вірити, що Бог', 0)],
    [('обовʼязково відповість.', 0)]]}
rows('p0b53', 'Розфарбуй малюнок Захарія', 'та Єлисавети.', right=FULL_RIGHT)

# ═══════════════════════════════════════════════════════════ сторінка 2
TR['p1b0'] = {'lines': [
    [('bible', 0), ('time', 1)],
    [('Рівень 0 — біблійні історії', 2)]]}
rows('p1b1', 'www.besweb.com')
one('p1b2', 'A12')
story('p1b3', 2, 'Марія та Гавриїл')
one('p1b4', 'Ця історія про те, як Марія повірила Божому слову.')
guidance('p1b6',
         'поговоріть із дітьми про те, чого люди не можуть: літати, зникати '
         'тощо.',
         'Біблія каже, що Бог могутній і може те, чого не можуть люди: '
         'послати дощ, зробити день і ніч.',
         'У сьогоднішній історії Марія вірить у Божу силу.',
         read='Луки 1:26-38')
line('p1b7', 'До Марії прийшов Ангол. Ангола звали Гавриїл.')
TR['p1b8'] = {'right': FULL_RIGHT, 'lines': [
    [('Гавриїл сказав Марії, що в неї народиться дуже особливе Немовля. Це', 0)],
    [('Немовля мало називатися Ісус. Він — Син Божий.', 0)],
    [("З'єднай крапки й намалюй Ангола Гавриїла, який говорить із Марією.", 1)]]}
line('p1b9', 'Марія дивувалася, як таке може бути.')
line('p1b10', 'Ангол сказав їй, що Бог може робити те, що людям здається неможливим.',
     'Марія повірила всьому, що сказав Ангол.')
marks('p1b11', '/ 10')
TR['p1b23'] = {'center': True, 'lines': [
    [('Чи віриш ти,', 0)], [('що Бог може', 0)], [('робити велике?', 0)]]}

# ═══════════════════════════════════════════════════════════ сторінка 3
rows('p2b0', 'www.besweb.com')
TR['p2b1'] = {'lines': [
    [('bible', 0), ('time', 1)],
    [('Рівень 0 — біблійні історії', 2)],
    [('A12', 3)]]}
marks('p2b2', '/ 10')
story('p2b3', 3, 'Народження Івана')
one('p2b4', 'Ця історія про те, як Бог дотримує Своїх обіцянок.')
read('p2b6', 'Луки 1:57-66')
guidance('p2b7',
         'поясніть, що обіцянка — це те, що ми плануємо зробити в '
         'майбутньому. Коли це',
         'стається, ми кажемо, що обіцянку дотримано. Наведіть зрозумілий для '
         'цього віку приклад обіцянки, яку',
         'дали й дотримали. Поясніть, що Бог дотримав Свою обіцянку Захарію та '
         'Єлисаветі. Біблія навчає, що Бог',
         'ніколи не порушує Своїх обіцянок.')
line('p2b8', 'Ангол сказав Захарію та Єлисаветі, що в них народиться син. Бог',
     'дотримав обіцянку, і хлопчик народився.')
line('p2b9', 'Рідні й друзі думали, як назвуть дитину.')
line('p2b10', 'Захарій усе ще не міг говорити, бо не повірив Анголові. Він',
     'написав, що хлопчика назвуть Іван, так, як сказав йому',
     'Ангол.')
# Праворуч від інструкції починається сувій (x ≈ 323), тож рядок короткий.
rows('p2b11', "З'єднай крапки. Що написав Захарій?",
     'Розфарбуй сувій.', right=321.0)
line('p2b12', 'Щойно Захарій написав це, він знову зміг говорити й хвалити Бога.')
line('p2b13', 'Хлопчик Іван виріс і став великою людиною, яка приготувала все до',
     'приходу Ісуса.')
TR['p2b21'] = {'center': True, 'lines': [
    [('Захарій був', 0)], [('дуже вдячний Богові', 0)],
    [('за дотриману обіцянку.', 0)], [('А за що ти', 0)],
    [('можеш подякувати', 0)], [('Богові?', 0)]]}
# Сувій: «His name is» + «John.» по крапках. Обидва центруються на осі
# англійського напису; ім'я малюється в `POST`.
SCROLL_CX = 230.5
centred('p2b22', ["Його ім'я", None], 0, SCROLL_CX)

# ═══════════════════════════════════════════════════════════ сторінка 4
TR['p3b0'] = {'lines': [[('Бали', 0), (' (вписує вчитель)', 1)]]}
for _i in range(1, 5):
    one(f'p3b{_i}', f'ІСТОРІЯ {_i}:')
# Таблиця балів у рівні 0 стоїть на 2.9 pt нижче, ніж у рівнях 1–4; «Разом»
# переїздить на порожній рядок вище, на його місце — «Додаткові бали».
MARKS_DY = 759.6 - MARKS_ROW_TOTAL
TR['p3b5'] = {'lines': [{'segs': [('Разом', 0)], 'y': MARKS_ROW_UP + MARKS_DY}]}
one('p3b6', 'Загалом')
# Другий підпис довший за англійський і від свого x вийшов би за край
# сторінки — зсунутий ліворуч.
TR['p3b7'] = {'right': 567.0, 'lines': [[('Коментар учителя:', 0)],
                                         [('Надішли свої уроки на адресу:', 0, 450.0)]]}
TR['p3b8'] = {'lines': [
    [('©', 0), (' Bible Educational Services. Відвідай ', 1), ('www.besweb.com', 2),
     (' або телефонуй +44 (0) 28 6632 2462.', 1)],
    [('Registered Charity UK CIO 1186004', 1)],
    [('РІВЕНЬ 0 A12', 3)],
    [('12/2025', 4)],
]}
story('p3b9', 4, 'Народження Ісуса')
one('p3b10', 'Ця історія про Ісуса, Божого Сина, Спасителя світу.')
guidance('p3b12',
         'допоможіть дітям зрозуміти, що Ісус народився зовсім не так, як '
         'вони, але',
         'був найособливішим немовлям з усіх. За картою внизу поясніть, чому '
         'Марія та Йосип мусили йти до',
         'Віфлеєма. Поясніть, що таке заїзд, через звичне для дітей слово. За '
         'малюнком унизу поясніть, що Марія',
         'поклала Ісуса в ясла, з яких годували тварин.',
         read='Луки 2:1-7')
marks('p3b13', '/ 10')
line('p3b14', 'Марія та Йосип вирушили в далеку подорож із Назарета до Віфлеєма.')
line('p3b15', 'Проведи лінію по дорозі, якою йшли Марія та Йосип.')
line('p3b16', 'У Віфлеємі було людно, і заїзди швидко заповнилися. Їм довелося',
     'ночувати там, де тримали тварин. Там і народився Ісус.')
# Праворуч від ясел (x = 235.4 … 543).
rows('p3b17', 'Ісус був дуже особливим Немовлям. Біблія',
     'каже, що Він — Син Божий, народжений, щоб',
     'стати нашим Спасителем.', right=FULL_RIGHT + 3)
# Назви на карті — над своїми містечками, як в оригіналі.
TR['p3b18'] = {'center': True, 'lines': [[('Назарет', 0)]]}
TR['p3b19'] = {'center': True, 'lines': [[('Віфлеєм', 0)]]}


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

ROUND = FONTFILES['SassoonInfantDtB']
_ROUND_FONT = fitz.Font(fontfile=ROUND)
NAME_TEXT, NAME_SIZE, NAME_Y = 'Іван.', 72.0, 539.0


def _draw_puzzles(doc, only=None):
    if only is None:
        marks_bonus(doc[3], y=MARKS_ROW_TOTAL + MARKS_DY)   # «Додаткові бали»
    if only is not None and 2 not in only:
        return
    page = doc[2]
    x = SCROLL_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("  стор. 3: ім'я по крапках — %s" % NAME_TEXT)


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) ──────────────────────────
GROW_OK = []


# ═══════════════════════════════════════════════ екранна версія
# На папері дитина обводить крапки, на екрані літери стають полями-заливками.
SCREEN_TEXT = {
    'p2b11': 'Розфарбуй літери. Що написав Захарій?\nРозфарбуй сувій.',
}


# Стор. 2, Ангол по крапках: руки в оригіналі не накреслені, Редактор обвела
# їх як області `a10` і `a13`. На екрані домальовуємо крапки по їхньому
# контуру (рішення замовника від 14 вересня 2026); друк не міняється.
# Геометрію бере з набору областей буклета — див. `artdots.py`.
import artdots  # noqa: E402

SCREEN_DOTS = {1: ['a10', 'a13']}          # індекс сторінки → назви областей


def _screen_hand_dots(doc, only=None):
    artdots.screen_dots(doc, only, 'Level0_A12_UA', SCREEN_DOTS)


SCREEN_POST = [_screen_hand_dots]
