from dataclasses import dataclass, asdict
from datetime import datetime
from typing import List, Dict, Any
import uuid

@dataclass
class SkillScore:
    skill_name: str
    score: int  # 0-10
    evidence: List[str]
    strengths: List[str]
    improvement_areas: List[str]
    
    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)
    
    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> 'SkillScore':
        return cls(**data)

@dataclass
class ConversationTurn:
    turn_number: int
    speaker: str  # 'learner' or 'ai'
    message: str
    timestamp: str
    
    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)
    
    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> 'ConversationTurn':
        return cls(**data)

@dataclass
class SkillAssessment:
    session_id: str
    scenario_id: str
    overall_score: float
    performance_level: str
    skill_scores: List[SkillScore]
    conversation_turns: List[ConversationTurn]
    conversation_analysis: Dict[str, Any]
    recommendations: Dict[str, Any]
    created_at: str
    
    @classmethod
    def create_new(cls, scenario_id: str, overall_score: float, performance_level: str,
                   skill_scores: List[SkillScore], conversation_turns: List[ConversationTurn],
                   conversation_analysis: Dict[str, Any], recommendations: Dict[str, Any]) -> 'SkillAssessment':
        return cls(
            session_id=str(uuid.uuid4()),
            scenario_id=scenario_id,
            overall_score=overall_score,
            performance_level=performance_level,
            skill_scores=skill_scores,
            conversation_turns=conversation_turns,
            conversation_analysis=conversation_analysis,
            recommendations=recommendations,
            created_at=datetime.now().isoformat()
        )
    
    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)
    
    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> 'SkillAssessment':
        # Convert nested objects
        skill_scores = [SkillScore.from_dict(score) for score in data['skill_scores']]
        conversation_turns = [ConversationTurn.from_dict(turn) for turn in data['conversation_turns']]
        
        return cls(
            session_id=data['session_id'],
            scenario_id=data['scenario_id'],
            overall_score=data['overall_score'],
            performance_level=data['performance_level'],
            skill_scores=skill_scores,
            conversation_turns=conversation_turns,
            conversation_analysis=data['conversation_analysis'],
            recommendations=data['recommendations'],
            created_at=data['created_at']
        )