from typing import Dict, List, Any, Optional
from models.scenario import RoleplayScenario
from services.groq_service import GroqService
from utils.json_handler import JSONHandler

class ScenarioGenerator:
    def __init__(self):
        self.groq_service = GroqService()
        self.json_handler = JSONHandler()
    
    def create_scenario(self, category: str, objective: str, details: Dict[str, Any], 
                       ai_role: str, learner_role: str, skills_to_assess: List[str]) -> Optional[RoleplayScenario]:
        """Create a new roleplay scenario"""
        
        # Validate inputs
        if len(skills_to_assess) > 5:
            skills_to_assess = skills_to_assess[:5]  # Limit to 5 skills
        
        # Prepare input for AI generation
        admin_input = {
            'category': category,
            'objective': objective,
            'details': details,
            'ai_role': ai_role,
            'learner_role': learner_role,
            'skills_to_assess': skills_to_assess
        }
        
        # Generate scenario using Groq
        scenario_data = self.groq_service.generate_scenario(admin_input)
        
        if not scenario_data:
            return None
        
        # Validate generated scenario structure
        required_keys = ['scenario_setup', 'ai_character', 'scenario_intro', 'conversation_starter', 'success_criteria']
        if not all(key in scenario_data for key in required_keys):
            print(f"Generated scenario missing required keys: {required_keys}")
            return None
        
        # Create scenario object
        scenario = RoleplayScenario.create_new(
            category=category,
            objective=objective,
            details=details,
            ai_role=ai_role,
            learner_role=learner_role,
            skills_to_assess=skills_to_assess,
            scenario_setup=scenario_data['scenario_setup'],
            ai_character=scenario_data['ai_character'],
            scenario_intro=scenario_data['scenario_intro'],
            conversation_starter=scenario_data['conversation_starter'],
            success_criteria=scenario_data['success_criteria']
        )
        
        # Save scenario to JSON
        if self.json_handler.save_scenario(scenario.to_dict()):
            return scenario
        else:
            print("Failed to save scenario")
            return None
    
    def load_scenario(self, scenario_id: str) -> Optional[RoleplayScenario]:
        """Load an existing scenario"""
        scenario_data = self.json_handler.load_scenario(scenario_id)
        if scenario_data:
            return RoleplayScenario.from_dict(scenario_data)
        return None
    
    def list_available_scenarios(self) -> List[Dict[str, Any]]:
        """List all available scenarios"""
        return self.json_handler.list_scenarios()
    
    def get_default_skills_for_category(self, category: str) -> List[str]:
        """Get default skills for a given category"""
        skill_mappings = {
            'Customer Service': [
                'Policy Adherence',
                'Empathy',
                'Communication Clarity',
                'Conflict Resolution',
                'Problem Solving'
            ],
            'Sales': [
                'Needs Assessment',
                'Product Knowledge',
                'Persuasion',
                'Objection Handling',
                'Relationship Building'
            ],
            'Leadership': [
                'Decision Making',
                'Team Communication',
                'Motivation',
                'Delegation',
                'Conflict Management'
            ],
            'Negotiation': [
                'Preparation',
                'Active Listening',
                'Creative Problem Solving',
                'Compromise',
                'Relationship Management'
            ],
            'Technical Support': [
                'Problem Diagnosis',
                'Technical Communication',
                'Patience',
                'Documentation',
                'Follow-up'
            ]
        }
        
        return skill_mappings.get(category, [
            'Communication',
            'Problem Solving',
            'Professionalism',
            'Adaptability',
            'Results Orientation'
        ])