
import pytest
from unittest.mock import MagicMock, patch
import dearpygui.dearpygui as dpg
import gui_legacy
from gui_legacy import App
import ai_client

@pytest.fixture
def app_instance():
    """
    Fixture to create an instance of the App class for testing.
    It creates a real DPG context but mocks functions that would
    render a window or block execution.
    """
    dpg.create_context()
    
    with patch('dearpygui.dearpygui.create_viewport'), \
         patch('dearpygui.dearpygui.setup_dearpygui'), \
         patch('dearpygui.dearpygui.show_viewport'), \
         patch('dearpygui.dearpygui.start_dearpygui'), \
         patch('gui_legacy.load_config', return_value={}), \
         patch('gui_legacy.PerformanceMonitor'), \
         patch('gui_legacy.shell_runner'), \
         patch('gui_legacy.project_manager'), \
         patch.object(App, '_load_active_project'), \
         patch.object(App, '_rebuild_files_list'), \
         patch.object(App, '_rebuild_shots_list'), \
         patch.object(App, '_rebuild_disc_list'), \
         patch.object(App, '_rebuild_disc_roles_list'), \
         patch.object(App, '_rebuild_discussion_selector'), \
         patch.object(App, '_refresh_project_widgets'):
        
        app = App()
        yield app
    
    dpg.destroy_context()

def test_gui_updates_on_event(app_instance):
    # Patch dependencies for the test
    with patch('dearpygui.dearpygui.set_value') as mock_set_value, \
         patch('dearpygui.dearpygui.does_item_exist', return_value=True), \
         patch('dearpygui.dearpygui.configure_item'), \
         patch('ai_client.get_history_bleed_stats') as mock_stats:
        
        mock_stats.return_value = {"percentage": 50.0, "current": 500, "limit": 1000}
        
        # We'll use patch.object to see if _refresh_api_metrics is called
        with patch.object(app_instance, '_refresh_api_metrics', wraps=app_instance._refresh_api_metrics) as mock_refresh:
            # Simulate event
            ai_client.events.emit("response_received", payload={})
            
            # Process tasks manually
            app_instance._process_pending_gui_tasks()
            
            # Verify that _refresh_api_metrics was called
            mock_refresh.assert_called_once()
        
        # Verify that dpg.set_value was called for the metrics widgets
        calls = [call.args[0] for call in mock_set_value.call_args_list]
        assert "token_budget_bar" in calls
        assert "token_budget_label" in calls
