|
from pathlib import Path |
|
import json |
|
import shutil |
|
from typing import Dict, Any |
|
from app.core.logging import LoggerMixin |
|
|
|
class FileManager(LoggerMixin): |
|
BASE_DATA_DIR = Path("data") |
|
DEFAULT_DIR = BASE_DATA_DIR / "default" |
|
|
|
@classmethod |
|
def ensure_directories(cls) -> None: |
|
"""Ensure all required directories exist""" |
|
cls.BASE_DATA_DIR.mkdir(exist_ok=True) |
|
cls.DEFAULT_DIR.mkdir(exist_ok=True) |
|
|
|
@classmethod |
|
def create_session_directory(cls, session_id: str) -> Path: |
|
"""Create a new directory for the session""" |
|
session_dir = cls.BASE_DATA_DIR / session_id |
|
session_dir.mkdir(exist_ok=True) |
|
return session_dir |
|
|
|
@classmethod |
|
def save_session_data(cls, session_id: str, names: Dict, player_details: Dict, wagons: Dict) -> None: |
|
"""Save the three main data files for a session""" |
|
session_dir = cls.create_session_directory(session_id) |
|
logger = cls.get_logger() |
|
|
|
|
|
files_to_save = { |
|
"names.json": names, |
|
"player_details.json": player_details, |
|
"wagons.json": wagons |
|
} |
|
|
|
for filename, data in files_to_save.items(): |
|
file_path = session_dir / filename |
|
cls.save_json(file_path, data) |
|
logger.info(f"Saved session data | session_id={session_id} | filename={filename} | path={file_path}") |
|
|
|
@classmethod |
|
def get_data_directory(cls, session_id: str, default_game: bool) -> Path: |
|
"""Get the appropriate data directory based on default_game flag""" |
|
if default_game: |
|
return cls.DEFAULT_DIR |
|
return cls.BASE_DATA_DIR / session_id |
|
|
|
@classmethod |
|
def load_session_data(cls, session_id: str, default_game: bool = True) -> tuple[Dict, Dict, Dict]: |
|
"""Load all data files for a session""" |
|
logger = cls.get_logger() |
|
data_dir = cls.get_data_directory(session_id, default_game) |
|
|
|
if not data_dir.exists(): |
|
logger.error(f"Data directory not found | session_id={session_id} | directory={data_dir}") |
|
raise FileNotFoundError(f"No data found for session {session_id}") |
|
|
|
try: |
|
names = cls.load_json(data_dir / "names.json") |
|
player_details = cls.load_json(data_dir / "player_details.json") |
|
wagons = cls.load_json(data_dir / "wagons.json") |
|
|
|
logger.info( |
|
f"Loaded session data | session_id={session_id} | " |
|
f"source={'default' if default_game else 'session'} | " |
|
f"directory={data_dir}" |
|
) |
|
return names, player_details, wagons |
|
|
|
except FileNotFoundError as e: |
|
logger.error(f"Failed to load files | session_id={session_id} | directory={data_dir} | error={str(e)}") |
|
raise FileNotFoundError(f"Missing required data files in {data_dir}") |
|
|
|
@staticmethod |
|
def save_json(file_path: Path, data: Dict[str, Any]) -> None: |
|
"""Save data to a JSON file""" |
|
with open(file_path, 'w') as f: |
|
json.dump(data, f, indent=2) |
|
|
|
@staticmethod |
|
def load_json(file_path: Path) -> Dict: |
|
"""Load data from a JSON file""" |
|
with open(file_path, 'r') as f: |
|
return json.load(f) |