import pytest
import sys
import os

# Ensure project root is in path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from src.api_hook_client import ApiHookClient

def test_hooks_enabled_via_cli(monkeypatch: pytest.MonkeyPatch) -> None:
 from src.gui_2 import App
 from unittest.mock import patch
 monkeypatch.setattr("sys.argv", ["sloppy.py", "--enable-test-hooks"])
 with patch('src.app_controller.AppController.load_config', return_value={}), \
   patch('src.performance_monitor.PerformanceMonitor'), \
   patch('src.session_logger.open_session'), \
   patch('src.session_logger.reset_session'), \
   patch('src.app_controller.AppController._prune_old_logs'), \
   patch('src.app_controller.AppController._init_ai_and_hooks'):
  app = App()
  assert app.controller.test_hooks_enabled is True

def test_hooks_disabled_by_default() -> None:
 from src.gui_2 import App
 from unittest.mock import patch
 with patch('src.app_controller.AppController.load_config', return_value={}), \
   patch('src.performance_monitor.PerformanceMonitor'), \
   patch('src.session_logger.open_session'), \
   patch('src.session_logger.reset_session'), \
   patch('src.app_controller.AppController._prune_old_logs'), \
   patch('src.app_controller.AppController._init_ai_and_hooks'):
  app = App()
  assert app.controller.test_hooks_enabled is False

def test_live_hook_server_responses(live_gui) -> None:
 """Verifies the live hook server (started via fixture) responds correctly to all major endpoints."""
 client = ApiHookClient()
 assert client.wait_for_server(timeout=10)
 
 # 1. Status
 status = client.get_status()
 assert "status" in status
 # Initial state can be idle or done depending on previous runs in same process tree
 assert status["status"] in ("idle", "done", "ok")
 
 # 2. Project
 proj = client.get_project()
 assert "project" in proj
 
 # 3. GUI State
 state = client.get_gui_state()
 assert "current_provider" in state
 
 # 4. Performance
 # diagnostics are available via get_gui_diagnostics or get_gui_state
 perf = client.get_gui_diagnostics() if hasattr(client, 'get_gui_diagnostics') else client.get_gui_state()
 assert "fps" in perf or "thinking" in perf