"""Unit test for SystemTrayManager in src/assistant_tool/system_tray_manager.py."""

import os
import sys
import unittest
from unittest.mock import MagicMock, patch

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from src.assistant_tool.system_tray_manager import SystemTrayManager


class TestSystemTrayManager(unittest.TestCase):
    def setUp(self):
        self.mock_app = MagicMock()
        self.mock_exit = MagicMock()
        self.mock_toggle = MagicMock()

        self.tray = SystemTrayManager(
            app=self.mock_app,
            on_exit_callback=self.mock_exit,
            on_toggle_bot_callback=self.mock_toggle,
        )

    def test_create_icon_image(self):
        img = self.tray._create_icon_image()
        self.assertIsNotNone(img)
        self.assertEqual(img.size, (64, 64))

    def test_toggle_window_calls_after(self):
        self.tray.toggle_window()
        self.mock_app.after.assert_called_once()

    def test_do_toggle_window_deiconify_when_withdrawn(self):
        self.mock_app.state.return_value = "withdrawn"
        self.mock_app.winfo_viewable.return_value = False
        self.tray._do_toggle_window()
        self.mock_app.deiconify.assert_called_once()
        self.mock_app.lift.assert_called_once()
        self.mock_app.focus_force.assert_called_once()

    def test_do_toggle_window_withdraw_when_visible(self):
        self.mock_app.state.return_value = "normal"
        self.mock_app.winfo_viewable.return_value = True
        self.tray._do_toggle_window()
        self.mock_app.withdraw.assert_called_once()

    def test_show_and_hide_window(self):
        self.tray.show_window()
        self.mock_app.after.assert_called()

        self.tray.hide_window()
        self.mock_app.after.assert_called()

    def test_toggle_bot(self):
        self.tray.toggle_bot()
        self.mock_app.after.assert_called_with(0, self.mock_toggle)

    def test_quit_app(self):
        self.tray.quit_app()
        self.mock_app.after.assert_called_with(0, self.mock_exit)

    def test_stop(self):
        mock_icon = MagicMock()
        self.tray.icon = mock_icon
        self.tray.stop()
        mock_icon.stop.assert_called_once()
        self.assertFalse(self.tray.is_running())


if __name__ == "__main__":
    unittest.main()
