from dataclasses import dataclass, asdict
from datetime import datetime
from typing import List, Dict, Any
import uuid

@dataclass
class RoleplayScenario:
    session_id: str
    category: str
    objective: str
    details: Dict[str, Any]
    ai_role: str
    learner_role: str
    skills_to_assess: List[str]
    scenario_setup: Dict[str, Any]
    ai_character: Dict[str, Any]
    scenario_intro: str
    conversation_starter: str
    success_criteria: str
    created_at: str
    
    @classmethod
    def create_new(cls, session_id: str, category: str, objective: str, details: Dict[str, Any], 
                   ai_role: str, learner_role: str, skills_to_assess: List[str],
                   scenario_setup: Dict[str, Any], ai_character: Dict[str, Any],
                   scenario_intro: str, conversation_starter: str, success_criteria: str) -> 'RoleplayScenario':
        return cls(
            session_id=session_id,
            category=category,
            objective=objective,
            details=details,
            ai_role=ai_role,
            learner_role=learner_role,
            skills_to_assess=skills_to_assess[:5],  # Max 5 skills
            scenario_setup=scenario_setup,
            ai_character=ai_character,
            scenario_intro=scenario_intro,
            conversation_starter=conversation_starter,
            success_criteria=success_criteria,
            created_at=datetime.now().isoformat()
        )
    
    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)
    
    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> 'RoleplayScenario':
        # Handle backward compatibility for scenarios without scenario_intro
        if 'scenario_intro' not in data:
            data['scenario_intro'] = f"You are about to engage in a roleplay as a {data.get('learner_role', 'participant')}. The scenario will begin when the other person starts the conversation."
        
        # Handle backward compatibility for old scenarios with 'id' instead of 'session_id'
        if 'id' in data and 'session_id' not in data:
            data['session_id'] = data.pop('id')
        
        return cls(**data)