"""
Browser API für Pinguin Browser Addons
"""

class BrowserAPI:
    """
    API-Objekt das Addons zur Verfügung gestellt wird.
    Addons können über diese API mit dem Browser interagieren.
    """
    
    def __init__(self, browser_instance):
        self.browser = browser_instance
    
    # === Tab Management ===
    def add_tab(self, url=None, make_active=True):
        """Öffnet einen neuen Tab"""
        return self.browser.add_tab(url=url, make_active=make_active)
    
    def close_tab(self, index=None):
        """Schließt einen Tab"""
        self.browser.close_tab(index)
    
    def get_current_tab(self):
        """Gibt aktuellen Tab zurück"""
        return self.browser.tabs.currentWidget()
    
    def get_tab_count(self):
        """Gibt Anzahl der Tabs zurück"""
        return self.browser.tabs.count()
    
    # === Navigation ===
    def navigate_to(self, url):
        """Navigiert zur URL"""
        view = self.browser.safe_view()
        if view:
            from PyQt5.QtCore import QUrl
            view.setUrl(QUrl(url))
    
    def go_back(self):
        """Navigation zurück"""
        self.browser.go_back()
    
    def go_forward(self):
        """Navigation vorwärts"""
        self.browser.go_forward()
    
    def reload(self):
        """Seite neu laden"""
        self.browser.reload_tab()
    
    # === UI ===
    def show_notification(self, message, level="info"):
        """Zeigt Benachrichtigung"""
        self.browser.show_notification(message, level)
    
    def show_sidebar(self, title, content_widget):
        """Zeigt Sidebar mit Custom Content"""
        self.browser.clear_layout(self.browser.side_layout)
        self.browser.sidebar.setTitleBarWidget(
            self.browser.build_title_bar(title)
        )
        self.browser.sidebar_title_label.setText(title)
        self.browser.sidebar_back_btn.show()
        self.browser.side_layout.addWidget(content_widget)
        self.browser.sidebar.show()
        self.browser.sidebar_act.setChecked(True)
    
    # === Settings ===
    def get_setting(self, key, default=None):
        """Liest Einstellung"""
        return self.browser.settings.get(key, default)
    
    def set_setting(self, key, value):
        """Setzt Einstellung"""
        self.browser.settings[key] = value
        self.browser.save_settings()
    
    # === Toolbar ===
    def add_toolbar_button(self, text, callback, icon=None):
        """Fügt Button zur Toolbar hinzu"""
        from PyQt5.QtWidgets import QAction
        from PyQt5.QtGui import QIcon
        
        action = QAction(text, self.browser)
        if icon:
            action.setIcon(QIcon(icon))
        action.triggered.connect(callback)
        self.browser.nav_tb.addAction(action)
        return action
    
    # === Storage ===
    def store_data(self, key, data):
        """Speichert Addon-Daten"""
        import json
        import os
        
        addon_data_dir = "data/addon_data"
        os.makedirs(addon_data_dir, exist_ok=True)
        
        filepath = os.path.join(addon_data_dir, f"{key}.json")
        with open(filepath, 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=2)
    
    def load_data(self, key):
        """Lädt Addon-Daten"""
        import json
        import os
        
        filepath = os.path.join("data/addon_data", f"{key}.json")
        if os.path.exists(filepath):
            with open(filepath, 'r', encoding='utf-8') as f:
                return json.load(f)
        return None
    
    # === Browser Info ===
    def get_current_url(self):
        """Gibt aktuelle URL zurück"""
        view = self.browser.safe_view()
        if view:
            return view.url().toString()
        return None
    
    def get_browser_version(self):
        """Gibt Browser-Version zurück"""
        return "1.0.0"
    
    # === Advanced ===
    def execute_javascript(self, code, callback=None):
        """Führt JavaScript auf aktueller Seite aus"""
        view = self.browser.safe_view()
        if view:
            if callback:
                view.page().runJavaScript(code, callback)
            else:
                view.page().runJavaScript(code)