# nsx/ns14engine.py
import webview
import os
import sys
import threading # 💡 यह बहुत ज़रूरी है

# 💡 Global variable ताकि Circular Reference न हो
_active_window = None 

def get_resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

class BackendAPI:
    def navigate(self, screen_name, params=None):
        global _active_window
        if _active_window:
            print(f"📡 Navigating to: {screen_name}")
            html = compile_nsx(f"src/{screen_name}.nsx", params)
            
            # 🔥 असली जादू यहाँ है!
            # JS callback के तुरंत अंदर load_html कॉल करने से recursion error आता है।
            # इसे एक अलग Thread में रन करने से एरर 100% गायब हो जाएगा।
            def update_ui():
                _active_window.load_html(html)
                
            # 0.05 सेकंड का हल्का सा डिले देकर अलग थ्रेड में चलाएं
            threading.Timer(0.05, update_ui).start()

def compile_nsx(file_path, props=None):
    full_path = get_resource_path(file_path)
    if not os.path.exists(full_path):
        return f"<h1>404: {file_path} Not Found</h1>"

    with open(full_path, "r", encoding="utf-8") as f:
        nsx_code = f.read()
    
    # ✅ डिक्शनरी के लिए सिंगल ब्रेसेस इस्तेमाल करें
    env = {"props": props} if props else {"props": {}}
    
    try:
        # globals और locals दोनों के लिए env दें ताकि exec सुरक्षित रहे
        exec(nsx_code, env, env) 
        if "render" in env:
            return env["render"]()
    except Exception as e:
        return f"<h1 style='color:red;'>Rendering Error: {e}</h1>"
    return "<h1>Error: render() missing!</h1>"

def run_nsx_app():
    global _active_window
    api = BackendAPI()
    initial_html = compile_nsx('src/App.nsx')
    
    # विंडो को ग्लोबल वेरिएबल में स्टोर करें
    _active_window = webview.create_window(
        'NSX Professional App', 
        html=initial_html, 
        js_api=api, 
        width=900, 
        height=700, 
        background_color='#111122'
    )
    
    webview.start()