import json from datetime import datetime from pathlib import Path from config.settings import settings from models.bible import Character, Event, Location, StoryBible, StoryThread from services.project_service import project_service class BibleService: def __init__(self): from config.settings import settings self.data_dir = Path(settings.DATA_DIR) self.project_service = project_service def _get_bible_file(self, project_id: str, user_id: str) -> Path: """Получить путь к файлу Story Bible проекта""" project_dir = self.project_service.get_project_dir(project_id, user_id) return project_dir / "story_bible.json" def _load_bible(self, project_id: str, user_id: str) -> StoryBible: """Загрузить Story Bible проекта""" bible_file = self._get_bible_file(project_id, user_id) if bible_file.exists(): with open(bible_file, "r", encoding="utf-8") as f: data = json.load(f) return StoryBible(**data) else: # Инициализация с примером данных return self._create_sample_bible() def _create_sample_bible(self) -> StoryBible: """Создать пример Story Bible для тестирования""" return StoryBible( characters=[ Character( name="Алекс", description="Главный герой, бывший архитектор", traits=["Циничный", "Справедливый", "Наблюдательный"], appearance="Высокий, темные волосы, шрам на левой руке", role="protagonist", ), Character( name="Лира", description="Таинственная проводница", traits=["Загадочная", "Решительная"], appearance="Носит красный плащ, зеленые глаза", role="supporting", ), ], locations=[ Location( name="Нижний Город", description="Старая часть города с узкими улочками", atmosphere="Вечный туман, запах озона и мокрого камня", type="city", ) ], events=[ Event( title="Встреча с Лирой", description="Алекс встречает Лиру в тумане Нижнего Города", chapter="Глава 1", importance="major", ) ], threads=[ StoryThread( title="Тайна хранилища", description="Поиск древнего хранилища знаний", status="active", related_characters=[], related_events=[], ) ], last_updated=datetime.now().isoformat(), ) def _save_bible(self, project_id: str, bible: StoryBible, user_id: str): """Сохранить Story Bible проекта""" bible_file = self._get_bible_file(project_id, user_id) bible.last_updated = datetime.now().isoformat() with open(bible_file, "w", encoding="utf-8") as f: json.dump(bible.model_dump(), f, ensure_ascii=False, indent=2) def get_bible(self, project_id: str, user_id: str) -> StoryBible: """Получить Story Bible проекта""" return self._load_bible(project_id, user_id) def update_bible( self, project_id: str, new_bible: StoryBible, user_id: str ) -> StoryBible: """Обновить Story Bible проекта""" self._save_bible(project_id, new_bible, user_id) return new_bible def add_character( self, project_id: str, character: Character, user_id: str ) -> Character: """Добавить персонажа в проект""" bible = self._load_bible(project_id, user_id) bible.characters.append(character) self._save_bible(project_id, bible, user_id) return character def add_location( self, project_id: str, location: Location, user_id: str ) -> Location: """Добавить локацию в проект""" bible = self._load_bible(project_id, user_id) bible.locations.append(location) self._save_bible(project_id, bible, user_id) return location def add_event(self, project_id: str, event: Event, user_id: str) -> Event: """Добавить событие в проект""" bible = self._load_bible(project_id, user_id) bible.events.append(event) self._save_bible(project_id, bible, user_id) return event def add_thread( self, project_id: str, thread: StoryThread, user_id: str ) -> StoryThread: """Добавить сюжетную нить в проект""" bible = self._load_bible(project_id, user_id) bible.threads.append(thread) self._save_bible(project_id, bible, user_id) return thread # Singleton instance bible_service = BibleService()