# BIgo Reader - Architecture Proposal

## Концепция

**BIgo Reader** - standalone приложение для чтения книг Go с просмотром диаграмм и изучения текста.

### Главное окно: BookTextWindow (расширенное)

Текстовое окно станет **основным приложением** с:
- Менеджмент всех дочерних окон (PDF viewer, diagram viewer)
- Главное меню и настройки
- Управление библиотекой книг
- Закладки и история чтения

---

## Модульная структура

```
bigo_reader/
├── __init__.py
├── main.py                      # Entry point: запуск главного окна
│
├── core/                        # Ядро приложения
│   ├── __init__.py
│   ├── app.py                   # ReaderApp - главное приложение
│   ├── config.py                # Конфигурация, константы
│   └── session.py               # Управление сеансом чтения (текущая книга, страница)
│
├── ui/                          # Пользовательский интерфейс
│   ├── __init__.py
│   ├── main_window.py           # MainReaderWindow (на основе BookTextWindow)
│   ├── pdf_viewer.py            # BookPageViewer (упрощенный BookViewer)
│   ├── diagram_viewer.py        # DiagramViewerWindow (просмотр диаграмм)
│   ├── settings_dialog.py       # Настройки приложения
│   └── book_selector.py         # Выбор книги из библиотеки
│
├── data/                        # Работа с данными
│   ├── __init__.py
│   ├── db_manager.py            # Подключение к БД (из bigo_book.db_utils)
│   ├── book_repository.py       # CRUD операции с книгами
│   ├── history_repository.py    # История чтения, закладки
│   └── models.py                # Data models (Book, ReadingHistory, Bookmark)
│
├── features/                    # Функциональные модули
│   ├── __init__.py
│   ├── text_reader.py           # Чтение текста страниц (из book_text)
│   ├── diagram_parser.py        # Парсинг диаграмм @DIAGRAM(n):name@
│   ├── page_links.py            # Обработка ссылок pg123
│   ├── bookmarks.py             # Закладки пользователя
│   ├── annotations.py           # Заметки пользователя
│   └── search.py                # Поиск по тексту книги
│
├── diagrams/                    # Модуль просмотра диаграмм
│   ├── __init__.py
│   ├── diagram_display.py       # Отображение диаграмм из БД
│   ├── board_widget.py          # GoBoard для просмотра
│   ├── variant_navigator.py     # Навигация по вариантам (только просмотр)
│   └── diagram_loader.py        # Загрузка диаграмм из БД
│
├── editing/                     # Модуль редактирования (БУДУЩЕЕ)
│   ├── __init__.py
│   ├── diagram_editor.py        # DiagramEditorWindow (на базе InputProblems)
│   ├── variant_manager.py       # Управление вариантами
│   ├── auto_labels.py           # Автобуквы и автонумерация
│   ├── dgr_import.py            # Импорт DGR формата
│   └── sgf_export.py            # Экспорт в SGF
│
├── widgets/                     # Переиспользуемые виджеты
│   ├── __init__.py
│   ├── go_board.py              # Виджет доски Go
│   ├── text_display.py          # Текстовый виджет с подсветкой
│   ├── diagram_list.py          # Список диаграмм
│   └── page_navigator.py        # Навигация по страницам
│
├── utils/                       # Утилиты
│   ├── __init__.py
│   ├── pdf_utils.py             # Работа с PDF (PyMuPDF)
│   ├── image_utils.py           # Обработка изображений
│   ├── sgf_parser.py            # SGF парсинг (из bigo_core.sgf_utils)
│   └── validators.py            # Валидация данных
│
└── resources/                   # Ресурсы
    ├── icons/                   # Иконки
    ├── styles/                  # Стили UI
    └── default_config.json      # Конфигурация по умолчанию
```

---

## Ключевые компоненты

### 1. MainReaderWindow (главное окно)

**Базируется на**: `BookTextWindow` из `bigo_book_text.py`

**Функционал**:
- ✅ Отображение текста страницы с диаграммами
- ✅ Кликабельные ссылки на диаграммы и страницы
- ✅ Навигация по страницам
- ➕ **Главное меню** (File, View, Tools, Help)
- ➕ **Статус-бар** с информацией о пользователе
- ➕ **Управление окнами** (PDF viewer, diagrams)
- ➕ **Закладки и аннотации**
- ➕ **Сохранение прогресса чтения**

**Новые возможности**:
```python
class MainReaderWindow(tk.Tk):  # Теперь главное окно (Tk, не Toplevel!)
    def __init__(self):
        # Меню
        self._create_menu()
        
        # Панели
        self._create_toolbar()
        self._create_statusbar()
        
        # Текстовая область (из BookTextWindow)
        self._create_text_area()
        
        # Управление окнами
        self.pdf_viewer = None
        self.diagram_viewer = None
        
        # Текущая книга и сессия
        self.current_book = None
        self.current_session = None  # SessionManager(book_id, current_page)
```

### 2. BookPageViewer (упрощенный PDF viewer)

**Базируется на**: `BookViewer` из `bigo_book_reader.py`

**Исключаем**:
- ❌ Редактирование диаграмм
- ❌ Экспорт/импорт
- ❌ Административные функции
- ❌ Разметка координат

**Сохраняем**:
- ✅ Просмотр страниц PDF
- ✅ Зум (fit page, fit width, manual)
- ✅ Навигация (стрелки, jump to page)
- ✅ Отображение обнаруженных диаграмм
- ✅ Клик по диаграмме → открытие в DiagramViewer

### 3. DiagramViewerWindow (просмотр диаграмм)

**Базируется на**: `DiagramViewer` из `bigo_book_reader.py` + упрощенная навигация из `InputProblemsWindow`

**Назначение**: **Просмотр диаграмм из книги** (позиции, задачи, варианты)

**Функционал**:
- ✅ Загрузка диаграммы из БД (по Dia_ID)
- ✅ Отображение доски с позицией
- ✅ Навигация по вариантам (только просмотр, без редактирования)
- ✅ Переключение между вариантами
- ✅ Показ номеров ходов и меток
- ✅ Информация о диаграмме (название, варианты)
- ✅ Зум доски (размер камней)
- ❌ **НЕТ редактирования** (откладываем на будущее)

### 4. История чтения и закладки

**SessionManager** - управление текущим сеансом чтения:

```python
class SessionManager:
    """Управление сеансом чтения одной книги."""
    
    def __init__(self, book_id: int):
        self.book_id = book_id
        self.current_page = self._load_last_page()
        self.bookmarks = self._load_bookmarks()
    
    def save_progress(self, page_number: int):
        """Сохранить текущую страницу."""
        
    def add_bookmark(self, page_number: int, note: str = ""):
        """Добавить закладку."""
        
    def get_bookmarks(self) -> list:
        """Получить все закладки для книги."""
```

**БД расширение** (опционально - для истории):
```sql
-- Таблица истории чтения (опционально)
CREATE TABLE Reading_History (
    History_ID INTEGER PRIMARY KEY,
    Book_ID INTEGER,
    Last_Page INTEGER,
    Last_Read_Date TEXT,
    FOREIGN KEY (Book_ID) REFERENCES Books(Book_ID)
);

-- Таблица закладок (опционально)
CREATE TABLE Bookmarks (
    Bookmark_ID INTEGER PRIMARY KEY,
    Book_ID INTEGER,
    Page_Number INTEGER,
    Note TEXT,
    Created_Date TEXT,
    FOREIGN KEY (Book_ID) REFERENCES Books(Book_ID)
);
```

**Примечание**: История и закладки могут храниться в отдельной локальной БД `reader_data.sqlite` или в конфигурационных файлах JSON.

---

## Workflow приложения

### Запуск приложения

```
1. main.py → запуск ReaderApp
2. Проверка БД книг (BIgo_Bookshelf.sqlite)
3. Открытие MainReaderWindow (главное окно)
4. BookSelector → выбор книги из библиотеки
5. Загрузка книги → восстановление последней страницы или стр. 1
6. Отображение текста страницы
```

### Сеанс чтения

```
MainReaderWindow (главное)
   │
   ├─ PDF Viewer (опционально)
   │  └─ Клик на диаграмме → Diagram Viewer
   │
   └─ Diagram Viewer (опционально, просмотр)
      ├─ Отображение позиции и вариантов
      ├─ Навигация по вариантам
      ├─ Показ номеров ходов и меток
      └─ Информация о диаграмме
      
   [Редактирование диаграмм - откладываем на будущее]
```

---

## Использование существующих модулей

### Из bigo_book.bigo_book_text:
- ✅ `BookTextWindow` → база для `MainReaderWindow`
- ✅ `fetch_page_text_and_diagrams()` → чтение текста
- ✅ Парсинг токенов `@DIAGRAM(n):name@`
- ✅ Обработка ссылок `pg123`

### Из bigo_book.bigo_book_reader:
- ✅ `BookViewer` → база для `BookPageViewer`
- ✅ PDF рендеринг (PyMuPDF/pypdfium2)
- ✅ `DiagramViewer` → показ диаграмм

### Из bigo_problems.input_problems:
- ✅ `GoBoard` → виджет доски Go (только отображение)
- ✅ `BoardState` → состояние доски (read-only)
- ✅ **Навигация по вариантам** (только просмотр, без редактирования)
- ⚠️ **Исключить**: редактирование, создание вариантов, экспорт/импорт (откладываем)

### Из bigo_core:
- ✅ `sgf_utils` → парсинг SGF
- ✅ `go_board` → логика доски Go

---

## Настройки приложения

**Категории**:

1. **Appearance** (Внешний вид)
   - Шрифты текста
   - Размеры окон
   - Цветовая схема доски

2. **Reading** (Чтение)
   - Автосохранение прогресса
   - Показывать диаграммы inline/popup
   - Автоматическое открытие PDF

3. **Diagrams** (Диаграммы)
   - Показывать номера ходов
   - Показывать метки
   - Размер камней
   - Навигация клавишами (вперед/назад)
   - Автоматическое открытие при клике в тексте

4. **Database** (База данных)
   - Путь к БД
   - Автобэкап
   - Очистка истории

---

## Этапы реализации

### Phase 1: Базовая структура (2-3 дня)
1. Создать структуру папок `bigo_reader/`
2. Портировать `BookTextWindow` → `MainReaderWindow`
3. Добавить главное меню и статус-бар
4. Создать `BookSelector` для выбора книги
5. Базовая навигация по страницам

### Phase 2: PDF и диаграммы (2-3 дня)
1. Портировать `BookViewer` → `BookPageViewer`
2. Интеграция с `MainReaderWindow`
3. Портировать `DiagramViewer`
4. Связка: текст → PDF → диаграммы

### Phase 3: История и закладки (1-2 дня)
1. `SessionManager` - управление сеансом чтения
2. Сохранение последней страницы (автоматически)
3. Закладки (добавление, удаление, переход)
4. История чтения (последние открытые книги)

### Phase 4: Модуль диаграмм (1-2 дня)
1. Создать `DiagramViewerWindow` (простой просмотр)
2. **Функции просмотра**:
   - Загрузка диаграммы из БД по Dia_ID
   - Отображение позиции и вариантов
   - Навигация по вариантам (стрелки, список)
   - Показ номеров ходов и меток
   - Информационная панель (название, N_Var)
3. Интеграция с `MainReaderWindow` (клик на @DIAGRAM)
4. Интеграция с `BookPageViewer` (клик на области)

### Phase 5: Финализация (1-2 дня)
1. Настройки приложения
2. Документация
3. Тестирование
4. Упаковка (PyInstaller)

---

## Преимущества архитектуры

✅ **Модульность**: Четкое разделение ответственности
✅ **Переиспользование**: Максимум кода из существующих модулей
✅ **Расширяемость**: Легко добавлять новые функции
✅ **Тестируемость**: Каждый модуль можно тестировать отдельно
✅ **Поддерживаемость**: Понятная структура для будущих изменений

---

## Вопросы для уточнения

1. **PDF встраивание**: Хранить PDF в БД или только ссылки? (можем использовать существующую схему)
2. **История**: Хранить в отдельной БД `reader_data.sqlite` или в конфиге JSON?
3. **Закладки**: С заметками или только номер страницы?
4. **Платформы**: Windows only или кроссплатформенность?
5. **Автосохранение**: Сохранять текущую страницу при каждом переходе или по таймеру?

---

## Следующий шаг

Хотите, чтобы я:
1. ✨ Создал базовую структуру папок и файлов?
2. 📄 Начал с `MainReaderWindow` (главное окно)?
3. 🔐 Реализовал систему регистрации?
4. 📚 Создал детальную спецификацию одного из модулей?

**Ваши пожелания?**
