from unittest.mock import Mock, patch

from skill_seekers.cli.llms_txt_detector import LlmsTxtDetector


def test_detect_llms_txt_variants():
    """Test detection of llms.txt file variants"""
    detector = LlmsTxtDetector("https://hono.dev/docs")

    with patch("skill_seekers.cli.llms_txt_detector.requests.head") as mock_head:
        mock_response = Mock()
        mock_response.status_code = 200
        mock_head.return_value = mock_response

        variants = detector.detect()

        assert variants is not None
        assert variants["url"] == "https://hono.dev/llms-full.txt"
        assert variants["variant"] == "full"
        mock_head.assert_called()


def test_detect_no_llms_txt():
    """Test detection when no llms.txt file exists"""
    detector = LlmsTxtDetector("https://example.com/docs")

    with patch("skill_seekers.cli.llms_txt_detector.requests.head") as mock_head:
        mock_response = Mock()
        mock_response.status_code = 404
        mock_head.return_value = mock_response

        variants = detector.detect()

        assert variants is None
        assert mock_head.call_count == 3  # Should try all three variants


def test_url_parsing_with_complex_paths():
    """Test URL parsing handles non-standard paths correctly"""
    detector = LlmsTxtDetector("https://example.com/docs/v2/guide")

    with patch("skill_seekers.cli.llms_txt_detector.requests.head") as mock_head:
        mock_response = Mock()
        mock_response.status_code = 200
        mock_head.return_value = mock_response

        variants = detector.detect()

        assert variants is not None
        assert variants["url"] == "https://example.com/llms-full.txt"
        mock_head.assert_called_with(
            "https://example.com/llms-full.txt", timeout=5, allow_redirects=True
        )


def test_detect_all_variants():
    """Test detecting all llms.txt variants"""
    detector = LlmsTxtDetector("https://hono.dev/docs")

    with patch("skill_seekers.cli.llms_txt_detector.requests.head") as mock_head:
        # Mock responses for different variants
        def mock_response(url, **_kwargs):
            response = Mock()
            # All 3 variants exist for Hono
            if "llms-full.txt" in url or "llms.txt" in url or "llms-small.txt" in url:
                response.status_code = 200
            else:
                response.status_code = 404
            return response

        mock_head.side_effect = mock_response

        variants = detector.detect_all()

        assert len(variants) == 3
        assert any(v["variant"] == "full" for v in variants)
        assert any(v["variant"] == "standard" for v in variants)
        assert any(v["variant"] == "small" for v in variants)
        assert all("url" in v for v in variants)
