"""
Tests for the enhanced compact command with AI summarization.
"""

import pytest
import asyncio
import os
from unittest.mock import Mock, patch, AsyncMock
from cai.repl.commands.compact import CompactCommand
from cai.sdk.agents.models.openai_chatcompletions import (
    get_agent_message_history,
    get_all_agent_histories,
)


class TestCompactCommand:
    """Test the CompactCommand class."""

    @pytest.fixture
    def compact_command(self):
        """Create a CompactCommand instance."""
        cmd = CompactCommand()
        return cmd

    def test_command_initialization(self, compact_command):
        """Test command is properly initialized."""
        assert compact_command.name == "/compact"
        assert "/cmp" in compact_command.aliases
        assert (
            len(compact_command.subcommands) >= 3
        )  # Should have model, prompt, status subcommands
        assert compact_command.compact_model is None  # Default to current model

    def test_handle_model(self, compact_command):
        """Test setting the compact model."""
        # Set a specific model
        result = compact_command.handle_model(["gpt-3.5-turbo"])
        assert result is True
        assert compact_command.compact_model == "gpt-3.5-turbo"

        # Set to default
        result = compact_command.handle_model(["default"])
        assert result is True
        assert compact_command.compact_model is None

        # No args shows current model
        result = compact_command.handle_model([])
        assert result is True

    def test_handle_prompt(self, compact_command):
        """Test setting the custom prompt."""
        # Set a custom prompt
        result = compact_command.handle_prompt(["Summarize the key CTF findings"])
        assert result is True
        assert compact_command.custom_prompt == "Summarize the key CTF findings"

        # Clear prompt by setting empty
        result = compact_command.handle_prompt([""])
        assert result is True
        assert compact_command.custom_prompt == ""

    def test_handle_status(self, compact_command):
        """Test status display."""
        # Set some custom settings
        compact_command.compact_model = "gpt-3.5-turbo"
        compact_command.custom_prompt = "Test prompt"

        result = compact_command.handle_status([])
        assert result is True

    @patch.object(CompactCommand, "_perform_compaction")
    def test_command_with_args(self, mock_perform, compact_command):
        """Test compact command with model and prompt arguments."""
        # Mock the actual compaction to avoid dependencies
        mock_perform.return_value = True

        # Test with model override
        result = compact_command.handle(["--model", "gpt-4"])
        assert result is True
        mock_perform.assert_called_with("gpt-4", None)

        # Test with prompt override
        result = compact_command.handle(["--prompt", "Custom prompt"])
        assert result is True
        mock_perform.assert_called_with(None, "Custom prompt")
