import pytest
from unittest.mock import MagicMock, patch, ANY
from src import gui_2
from src.gui_2 import App

@pytest.fixture
def app_instance():
 with (
  patch('src.app_controller.AppController.load_config', return_value={'ai': {'provider': 'gemini', 'model': 'gemini-2.5-flash-lite'}, 'projects': {}}),
  patch('src.app_controller.AppController.save_config'),
  patch('src.gui_2.project_manager'),
  patch('src.gui_2.session_logger'),
  patch('src.gui_2.immapp.run'),
  patch('src.app_controller.AppController._load_active_project'),
  patch('src.app_controller.AppController._fetch_models'),
  patch.object(App, '_load_fonts'),
  patch.object(App, '_post_init'),
  patch('src.app_controller.AppController._prune_old_logs'),
  patch('src.app_controller.AppController.start_services'),
  patch('src.api_hooks.HookServer'),
  patch('src.ai_client.set_provider'),
  patch('src.ai_client.reset_session')
 ):
  app = App()
  app.project = {
   "discussion": {
    "active": "main",
    "discussions": {
     "main": {"history": []},
     "take_1": {"history": []},
     "take_2": {"history": []}
    }
   }
  }
  app.ui_synthesis_prompt = "Summarize these takes"
  yield app

def test_render_synthesis_panel(app_instance):
 """Verify that render_synthesis_panel renders checkboxes for takes and input for prompt."""
 with patch('src.gui_2.imgui') as mock_imgui, \
      patch('src.gui_2.imscope') as mock_imscope:
  mock_imgui.checkbox.return_value = (False, False)
  mock_imgui.input_text_multiline.return_value = (False, app_instance.ui_synthesis_prompt)
  mock_imgui.button.return_value = False

  # Setup imscope mocks
  mock_imscope.window.return_value.__enter__.return_value = (True, True)
  mock_imscope.child.return_value.__enter__.return_value = True
  mock_imscope.table.return_value.__enter__.return_value = True
  mock_imscope.tree_node_ex.return_value.__enter__.return_value = True
  mock_imscope.tab_item.return_value.__enter__.return_value = (True, True)
  mock_imscope.style_color.return_value.__enter__.return_value = None
  mock_imscope.style_var.return_value.__enter__.return_value = None

  # Call the method we are testing
  gui_2.render_synthesis_panel(app_instance)

  # 1. Assert imgui.checkbox is called for each take in project_dict['discussion']['discussions']
  discussions = app_instance.project['discussion']['discussions']
  for name in discussions:
   mock_imgui.checkbox.assert_any_call(name, ANY)

  # 2. Assert imgui.input_text_multiline is called for the prompt
  mock_imgui.input_text_multiline.assert_called_with("##synthesis_prompt", app_instance.ui_synthesis_prompt, ANY)

  # 3. Assert imgui.button is called for 'Generate Synthesis'
  mock_imgui.button.assert_any_call("Generate Synthesis")