# -*- coding: utf-8 -*-
"""Конфіг уроку: усе, що відрізняє один буклет Bibletime від іншого.

Доти конвеєр був прив'язаний до Level 2 «У що вірять християни» константами
в чотирьох файлах (пункт 4 беклогу). Тут ці константи зібрані в одне місце,
щоб на урок припадав лише файл перекладу.

Значення виміряні по буклетах A1 усіх п'яти рівнів, не вгадані.
"""
import os
import re

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LESSONS = os.path.join(os.path.dirname(ROOT), "lessons")
EN_DIR = os.path.join(LESSONS, "en")
PRINT_DIR = os.path.join(LESSONS, "uk", "print")
INTERACTIVE_DIR = os.path.join(LESSONS, "uk", "interactive")
WORK_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "work")


class Level:
    """Те, що спільне для всіх буклетів одного рівня."""

    def __init__(self, n, colour, heading, q_marker, subtitle, pages):
        self.n = n
        #: фірмовий колір рівня; ним набрані інструкції та рамки
        self.colour = colour
        #: слово-заголовок історії: STORY / LESSON / STUDY
        self.heading = heading
        #: чи маркуються завдання явно
        self.q_marker = q_marker
        self.subtitle = subtitle
        self.pages = pages

    @property
    def colour_rgb(self):
        c = self.colour
        return ((c >> 16 & 255) / 255, (c >> 8 & 255) / 255, (c & 255) / 255)


# Кольори взято з реальних спанів: по одному фірмовому на рівень. Детектор
# варіантів відповіді шукав `0xea515a` жорстко — це працювало лише на рівні 2.
LEVELS = {
    0: Level(0, 0xB3579D, "STORY",  False, "Рівень 0 — біблійні історії", 4),
    1: Level(1, 0xF49944, "STORY",  False, "Рівень 1 — біблійні історії", 8),
    2: Level(2, 0xEA515A, "STORY",  True,  "Рівень 2 — біблійні історії", 8),
    3: Level(3, 0x009D78, "LESSON", True,  "Рівень 3 — біблійні історії", 8),
    4: Level(4, 0x3055A3, "STUDY",  True,  "Рівень 4 — біблійні історії", 8),
}

# Слово-заголовок історії українською. Три різні слова, бо в оригіналі вони
# теж різні й позначають різну роботу: переказ історії, урок, розбір тексту.
# «ТЕМА» замість буквального «ДОСЛІДЖЕННЯ» — воно вдвічі коротше, а в таблиці
# балів на останній сторінці колонка завширшки 35 pt.
HEADING_UK = {"STORY": "ІСТОРІЯ", "LESSON": "УРОК", "STUDY": "ТЕМА"}

# Спільна геометрія A4: колонка тексту закінчується перед боксами балів.
# Виміряно: бокси стоять на x0 = 509…513 у всіх п'яти рівнях.
CONTENT_RIGHT = 508.0
PAGE_RIGHT = 566.0

FONTFILES = {
    "ArialMT": "/System/Library/Fonts/Supplemental/Arial.ttf",
    "Arial-BoldMT": "/System/Library/Fonts/Supplemental/Arial Bold.ttf",
    "Arial-ItalicMT": "/System/Library/Fonts/Supplemental/Arial Italic.ttf",
    "Arial-BoldItalicMT": "/System/Library/Fonts/Supplemental/Arial Bold Italic.ttf",
    "Arial-Black": "/System/Library/Fonts/Supplemental/Arial Black.ttf",
    "HelveticaNeue-Bold": "/System/Library/Fonts/Supplemental/Arial Bold.ttf",
    "ZapfDingbatsITC": "/System/Library/Fonts/Supplemental/Arial Unicode.ttf",
    # SassoonInfantDtB — шрифт для обведення по крапках (Dt = dotted), кирилиці
    # не має. Підміна — SF NS Rounded: із 94 системних шрифтів із повною
    # українською кирилицею він найближчий за характером (округлий, простий).
    # «Arial Rounded Bold» тут не годиться — кирилиці в ньому теж немає, і всі
    # гліфи виходили порожніми квадратиками. Самі крапки малює
    # `puzzlekit.dotted_text()`.
    "SassoonInfantDtB": "/System/Library/Fonts/SFNSRounded.ttf",
}


class Lesson:
    """Один буклет: Level<N>_<A|B|C><1..12>."""

    def __init__(self, stem):
        m = re.fullmatch(r"Level(\d)_([ABC])(\d{1,2})", stem)
        if not m:
            raise ValueError(f"не схоже на буклет Bibletime: {stem!r}")
        self.stem = stem
        self.level = LEVELS[int(m.group(1))]
        self.series = m.group(2)
        self.num = int(m.group(3))

    @property
    def src(self):
        return os.path.join(EN_DIR, f"{self.stem}.pdf")

    @property
    def work(self):
        return os.path.join(WORK_DIR, self.stem)

    @property
    def template(self):
        return os.path.join(self.work, "template.json")

    @property
    def worksheet(self):
        return os.path.join(self.work, "worksheet.txt")

    @property
    def uk_stem(self):
        return f"{self.stem}_UA"

    def out(self, kind):
        """Наступна вільна версія у теці друку або інтерактиву.

        Кожна збірка — новий файл: переглядач тримає PDF відкритим і показує
        попередній рендер (§2.7 файла агента).
        """
        d = {"print": PRINT_DIR, "interactive": INTERACTIVE_DIR}[kind]
        os.makedirs(d, exist_ok=True)
        used = [
            int(mm.group(1))
            for fn in os.listdir(d)
            if (mm := re.fullmatch(re.escape(self.uk_stem) + r"_v(\d+)\.pdf", fn))
        ]
        return os.path.join(d, f"{self.uk_stem}_v{max(used, default=0) + 1:02d}.pdf")


def a1_set():
    """П'ять буклетів A1 — те, з чого починаємо партію."""
    return [Lesson(f"Level{n}_A1") for n in range(5)]
