import tiktoken
import re
import os

class PromptManager:
    def __init__(self):
        # 1. تحديد مسار محلي لتخزين ملفات tiktoken داخل المشروع
        # هذا يمنع المكتبة من البحث في مجلدات النظام المؤقتة
        cache_dir = os.path.join(os.path.dirname(__file__), "tiktoken_cache")
        os.makedirs(cache_dir, exist_ok=True)
        
        # 2. إجبار المكتبة على استخدام المجلد المحلي
        os.environ["TIKTOKEN_CACHE_DIR"] = cache_dir
        
        try:
            # محاولة تحميل القاموس (سيعمل أوفلاين إذا كان الملف موجوداً)
            self.enc = tiktoken.get_encoding("cl100k_base")
        except Exception:
            # حل احتياطي (Fallback) في حال فشل التحميل أونلاين لأول مرة
            # يضمن أن السيرفر لن يتوقف عن العمل
            self.enc = None

    def clean_medical_text(self, text: str) -> str:
        if not text: return ""
        # إزالة الحشو الطبي لتقليل عدد التوكنز
        text = re.sub(r"(informed consent was obtained|local anesthesia was administered|correctly|placed in position)", "", text, flags=re.IGNORECASE)
        return " ".join(text.split())

    def compress_input(self, text: str, max_tokens: int) -> str:
        refined = self.clean_medical_text(text)
        
        # إذا فشل تحميل tiktoken، نستخدم التقريب الحسابي كخطة بديلة
        if not self.enc:
            char_limit = max_tokens * 4 
            return refined[:char_limit] if len(refined) > char_limit else refined

        # الضغط الفعلي باستخدام التوكنز
        tokens = self.enc.encode(refined)
        if len(tokens) > max_tokens:
            # قص التوكنز الزائدة وإعادة تحويلها لنص
            return self.enc.decode(tokens[:max_tokens])
        return refined