#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Вирізати фігури з малюнків програми у `data/pictures/figures_A12.pdf`.

Копіюються лише ВЕКТОРНІ контури, що лежать у прямокутнику фігури (з
допуском 2 pt — крайні контури виходять за нього на частку пункта, і без
допуску зникали: Редактор помітив це на покривалах, 9 вересня 2026).
`show_pdf_page` з кліпом не годиться: він тягне за собою всю сторінку
(500 КБ на фігуру), а тут 130 КБ на п'ять.

    .venv/bin/python ua_build/cut_figures.py
"""
import os
import sys

import fitz

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)
from lessons import EN_DIR                                     # noqa: E402

OUT = os.path.join(os.path.dirname(HERE), 'data', 'pictures', 'figures_A12.pdf')
TOL = 2.0

# (назва, буклет, індекс сторінки, прямокутник у пунктах[, що викинути])
# Останнє — прямокутники, контури всередині яких не беруться: зірка над
# плечем Никодима — прикраса сторінки, а не фігури. Прямокутник має бути
# тісним: у Даниїла такий самий «про запас» зʼїв праве око (9 вересня 2026).
FIGURES = [
    ('elizabeth', 'Level1_A12', 0, (416.0, 356.1, 487.0, 570.7)),
    ('mary',      'Level1_B3',  1, (75.4, 264.1, 132.9, 462.1)),
    ('samaritan', 'Level1_B5',  1, (119.3, 303.0, 167.6, 441.2)),
    ('nicodemus', 'Level1_C3',  2, (409.1, 505.6, 505.1, 739.3),
     [(484.0, 513.0, 506.0, 535.0)]),            # зірка над плечем
    ('daniel',    'Level1_C1',  4, (87.0, 366.5, 155.0, 579.2)),
]


def copy_drawings(sp, clip, dp, dx, dy, tol=TOL, exclude=()):
    wide = fitz.Rect(clip.x0 - tol, clip.y0 - tol, clip.x1 + tol, clip.y1 + tol)
    n = 0
    for d in sp.get_drawings():
        r = fitz.Rect(d['rect'])
        if not wide.contains(r):
            continue
        if any(fitz.Rect(e).contains(r) for e in exclude):
            continue
        sh = dp.new_shape()
        for it in d['items']:
            op = it[0]
            if op == 'l':
                sh.draw_line(it[1] + (dx, dy), it[2] + (dx, dy))
            elif op == 'c':
                sh.draw_bezier(it[1] + (dx, dy), it[2] + (dx, dy),
                               it[3] + (dx, dy), it[4] + (dx, dy))
            elif op == 're':
                sh.draw_rect(fitz.Rect(it[1]) + (dx, dy, dx, dy))
            elif op == 'qu':
                sh.draw_quad(fitz.Quad([q + (dx, dy) for q in it[1]]))
        kw = dict(color=d.get('color'), fill=d.get('fill'),
                  width=d.get('width') or 0, closePath=d.get('closePath', False),
                  even_odd=d.get('even_odd', False))
        cap = d.get('lineCap')
        if cap:
            kw['lineCap'] = cap[0] if isinstance(cap, (tuple, list)) else cap
        if d.get('lineJoin') is not None:
            kw['lineJoin'] = d['lineJoin']
        if d.get('dashes') and d['dashes'] not in ('[] 0', '[]'):
            kw['dashes'] = d['dashes']
        for k in ('fill_opacity', 'stroke_opacity'):
            if d.get(k) is not None:
                kw[k] = d[k]
        sh.finish(**kw)
        sh.commit()
        n += 1
    return n


def main():
    out = fitz.open()
    for name, book, pno, rect, *rest in FIGURES:
        src = fitz.open(os.path.join(EN_DIR, book + '.pdf'))
        r = fitz.Rect(rect)
        pg = out.new_page(width=r.width + 2 * TOL, height=r.height + 2 * TOL)
        n = copy_drawings(src[pno], r, pg, TOL - r.x0, TOL - r.y0,
                          exclude=rest[0] if rest else ())
        print('%-10s %s стор. %d: контурів %d, %.0f×%.0f pt'
              % (name, book, pno + 1, n, r.width, r.height))
    out.save(OUT, deflate=True, garbage=4)
    print('->', os.path.relpath(OUT, os.path.dirname(HERE)),
          os.path.getsize(OUT) // 1024, 'КБ')


if __name__ == '__main__':
    main()
