File size: 2,423 Bytes
d60934b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from fastapi import APIRouter, HTTPException
from app.services.generate_train.generate_train import GenerateTrainService
from app.models.train import GenerateTrainResponse
from app.utils.file_management import FileManager
from app.core.logging import get_logger
from app.services.session_service import SessionService
import json 


router = APIRouter(
    prefix="/api/generate",
    tags=["train-generation"]
)

logger = get_logger("generate")

@router.get("/train/{session_id}/{number_of_wagons}/{theme}")
async def get_generated_train(
    session_id: str,
    number_of_wagons: str,
    theme: str
):
    """
    Generate a new train with specified parameters for a session.
    
    - Validates the session exists
    - Creates wagons with theme-appropriate passcodes
    - Generates passengers with names and profiles
    - Stores the generated data for the session
    - Returns the complete train data structure
    """
    session = SessionService.get_session(session_id)
    if not session:
        raise HTTPException(status_code=404, detail="Session not found")

    try:
        number_of_wagons = int(number_of_wagons)
    except ValueError:
        raise HTTPException(status_code=400, detail="number_of_wagons must be an integer")

    if number_of_wagons <= 0:
        raise HTTPException(status_code=400, detail="number_of_wagons must be greater than 0")
        
    if number_of_wagons > 6:
        raise HTTPException(status_code=400, detail="number_of_wagons cannot exceed 6")

    try:
        generate_train_service = GenerateTrainService()
        names_data, player_details_data, wagons_data = generate_train_service.generate_train(theme, number_of_wagons)
        
        # Save the raw data
        FileManager.save_session_data(session_id, names_data, player_details_data, wagons_data)

        # Construct response with proper schema
        response = {
            "names": names_data,
            "player_details": player_details_data,
            "wagons": wagons_data
        }

        logger.info(f"Setting default_game to False | session_id={session_id}")
        session.default_game = False 
        SessionService.update_session(session)
        return response
        
    except Exception as e:
        logger.error(f"Failed to generate train for session {session_id}: {str(e)}")
        raise HTTPException(status_code=500, detail=f"Failed to generate train: {str(e)}")