import json import os import random from typing import List, Dict, Any # PATH SETUP (Docker-safe) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) PROJECT_ROOT = os.path.dirname(BASE_DIR) DATASET_PATH = os.path.join(PROJECT_ROOT, "datasets", "disorders.json") # LOAD DATASET def load_disorders() -> List[Dict[str, Any]]: try: print(f"Loading dataset from: {DATASET_PATH}") with open(DATASET_PATH, "r", encoding="utf-8") as f: data = json.load(f) if not isinstance(data, list): raise ValueError("Dataset must be a list of disorder objects") print(f"Loaded {len(data)} disorders successfully ✅") return data except FileNotFoundError: print(f"❌ File not found: {DATASET_PATH}") return [] except json.JSONDecodeError: print(f"❌ Invalid JSON format in {DATASET_PATH}") return [] except Exception as e: print(f"❌ Unexpected error: {e}") return [] # INITIALIZE DATA disorders: List[Dict[str, Any]] = load_disorders() # CREATE FAST LOOKUP MAP disorders_map: Dict[str, Dict[str, Any]] = { d["name"]: d for d in disorders } # FUNCTIONS def get_random_disorder(n: int = 1) -> List[Dict[str, Any]]: if not disorders: return [] n = min(n, len(disorders)) return random.sample(disorders, n) def get_random_disorder_names(n: int = 1) -> List[str]: return [d["name"] for d in get_random_disorder(n)] def get_disorder_info(name: str) -> Dict[str, Any]: return disorders_map.get(name, {}) def get_symptoms(name: str, category: str = "emotional") -> List[str]: disorder = get_disorder_info(name) return disorder.get("symptoms", {}).get(category, []) def get_trigger_keywords(name: str) -> List[str]: disorder = get_disorder_info(name) return disorder.get("trigger_keywords", []) def get_random_symptom(name: str, category: str = "emotional") -> str: symptoms = get_symptoms(name, category) return random.choice(symptoms) if symptoms else "" # TEST (only runs directly) if __name__ == "__main__": print("Random disorder:", get_random_disorder(2)) if disorders: name = disorders[0]["name"] print("Sample disorder:", name) print("Symptoms:", get_random_symptom(name))