import json
import os
from typing import Dict, List, Any, Optional
from pathlib import Path

class JSONHandler:
    def __init__(self, base_path: str = "storage"):
        self.base_path = Path(base_path)
        self.scenarios_path = self.base_path / "scenarios"
        self.conversations_path = self.base_path / "conversations"
        self.assessments_path = self.base_path / "assessments"
        
        # Create directories if they don't exist
        self._create_directories()
    
    def _create_directories(self):
        """Create storage directories if they don't exist"""
        self.scenarios_path.mkdir(parents=True, exist_ok=True)
        self.conversations_path.mkdir(parents=True, exist_ok=True)
        self.assessments_path.mkdir(parents=True, exist_ok=True)
    
    def save_scenario(self, scenario_data: Dict[str, Any]) -> bool:
        """Save scenario to JSON file"""
        try:
            filename = f"scenario_{scenario_data['id']}.json"
            filepath = self.scenarios_path / filename
            
            with open(filepath, 'w', encoding='utf-8') as f:
                json.dump(scenario_data, f, indent=2, ensure_ascii=False)
            return True
        except Exception as e:
            print(f"Error saving scenario: {e}")
            return False
    
    def load_scenario(self, scenario_id: str) -> Optional[Dict[str, Any]]:
        """Load scenario from JSON file"""
        try:
            filename = f"scenario_{scenario_id}.json"
            filepath = self.scenarios_path / filename
            
            if not filepath.exists():
                return None
                
            with open(filepath, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            print(f"Error loading scenario: {e}")
            return None
    
    def list_scenarios(self) -> List[Dict[str, Any]]:
        """List all available scenarios"""
        scenarios = []
        try:
            for filepath in self.scenarios_path.glob("scenario_*.json"):
                with open(filepath, 'r', encoding='utf-8') as f:
                    scenario = json.load(f)
                    scenarios.append({
                        'id': scenario['id'],
                        'category': scenario['category'],
                        'objective': scenario['objective'],
                        'created_at': scenario['created_at']
                    })
        except Exception as e:
            print(f"Error listing scenarios: {e}")
        
        return sorted(scenarios, key=lambda x: x['created_at'], reverse=True)
    
    def save_conversation(self, session_id: str, conversation_data: Dict[str, Any]) -> bool:
        """Save conversation to JSON file"""
        try:
            filename = f"conversation_{session_id}.json"
            filepath = self.conversations_path / filename
            
            with open(filepath, 'w', encoding='utf-8') as f:
                json.dump(conversation_data, f, indent=2, ensure_ascii=False)
            return True
        except Exception as e:
            print(f"Error saving conversation: {e}")
            return False
    
    def load_conversation(self, session_id: str) -> Optional[Dict[str, Any]]:
        """Load conversation from JSON file"""
        try:
            filename = f"conversation_{session_id}.json"
            filepath = self.conversations_path / filename
            
            if not filepath.exists():
                return None
                
            with open(filepath, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            print(f"Error loading conversation: {e}")
            return None
    
    def save_assessment(self, assessment_data: Dict[str, Any]) -> bool:
        """Save assessment to JSON file"""
        try:
            filename = f"assessment_{assessment_data['session_id']}.json"
            filepath = self.assessments_path / filename
            
            with open(filepath, 'w', encoding='utf-8') as f:
                json.dump(assessment_data, f, indent=2, ensure_ascii=False)
            return True
        except Exception as e:
            print(f"Error saving assessment: {e}")
            return False
    
    def load_assessment(self, session_id: str) -> Optional[Dict[str, Any]]:
        """Load assessment from JSON file"""
        try:
            filename = f"assessment_{session_id}.json"
            filepath = self.assessments_path / filename
            
            if not filepath.exists():
                return None
                
            with open(filepath, 'r', encoding='utf-8') as f:
                return json.load(f)
        except Exception as e:
            print(f"Error loading assessment: {e}")
            return None
    
    def list_assessments(self) -> List[Dict[str, Any]]:
        """List all assessments with summary info"""
        assessments = []
        try:
            for filepath in self.assessments_path.glob("assessment_*.json"):
                with open(filepath, 'r', encoding='utf-8') as f:
                    assessment = json.load(f)
                    assessments.append({
                        'session_id': assessment['session_id'],
                        'scenario_id': assessment['scenario_id'],
                        'overall_score': assessment['overall_score'],
                        'performance_level': assessment['performance_level'],
                        'created_at': assessment['created_at']
                    })
        except Exception as e:
            print(f"Error listing assessments: {e}")
        
        return sorted(assessments, key=lambda x: x['created_at'], reverse=True)