import os from ..slugify import slugify from .support_connection import connect_support from .support_dir import support_dir from .support_slug import build_slug def create_support(name: str, owner_folder: str) -> str: """Crée le dossier du support (projects//_supports/ /) et sa base support.db dédiée — mirroir de db/games/create_game.py pour la mécanique de dossier/unicité de nom, mais un schéma entièrement différent (voir document_engine/ : un support est composé de PAGES — _document_pages —, chacune portant son propre flux d'éléments via _document_elements.page_id, jamais d'écrans/objets de scène comme côté jeu). Une première page ("Page 1") est toujours créée ici : un support n'existe jamais sans au moins une page (voir document_engine/pages/delete_document_page.py, qui refuse de supprimer la dernière). owner_folder n'est jamais optionnel ici (contrairement à create_game) : un support n'existe pas sans compte propriétaire.""" project_part = slugify(name) base = project_part n = 2 while os.path.isdir(support_dir(build_slug(owner_folder, base))): base = f"{project_part}-{n}" n += 1 project_part = base slug = build_slug(owner_folder, project_part) os.makedirs(support_dir(slug), exist_ok=True) conn = connect_support(slug) conn.executescript( """ CREATE TABLE _meta (key TEXT PRIMARY KEY, value TEXT); CREATE TABLE _document_pages ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL DEFAULT 'Page 1', order_index INTEGER NOT NULL DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE _document_elements ( id INTEGER PRIMARY KEY AUTOINCREMENT, page_id INTEGER NOT NULL REFERENCES _document_pages(id) ON DELETE CASCADE, parent_id INTEGER REFERENCES _document_elements(id) ON DELETE CASCADE, kind TEXT NOT NULL, order_index INTEGER NOT NULL DEFAULT 0, attributes TEXT NOT NULL DEFAULT '{}', created_at TEXT DEFAULT CURRENT_TIMESTAMP ); """ ) conn.execute("INSERT INTO _meta (key, value) VALUES ('name', ?)", (name,)) conn.execute("INSERT INTO _document_pages (title, order_index) VALUES ('Page 1', 0)") conn.commit() conn.close() return slug