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
    roleplay_questions: List[Dict[str, str]] = None
    # New roleplay metadata fields
    roleplay_name: str = ""
    role: str = ""
    difficulty: str = "medium"
    duration: int = 300
    max_attempts: int = 3

    @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,
                   roleplay_questions: List[Dict[str, str]] = None,
                   roleplay_name: str = "", role: str = "", difficulty: str = "medium",
                   duration: int = 300, max_attempts: int = 3) -> '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,
            roleplay_questions=roleplay_questions,
            roleplay_name=roleplay_name,
            role=role,
            difficulty=difficulty,
            duration=duration,
            max_attempts=max_attempts,
            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')

        # Handle backward compatibility for roleplay_questions
        if 'roleplay_questions' not in data:
            data['roleplay_questions'] = None

        # Handle backward compatibility for new roleplay metadata fields
        if 'roleplay_name' not in data:
            data['roleplay_name'] = ""
        if 'role' not in data:
            data['role'] = data.get('learner_role', '')
        if 'difficulty' not in data:
            data['difficulty'] = data.get('details', {}).get('difficulty_level', 'medium')
        if 'duration' not in data:
            data['duration'] = 300
        if 'max_attempts' not in data:
            data['max_attempts'] = 3

        return cls(**data)
