from typing import Any
from pathlib import Path
from src.aggregate import build_tier3_context

def test_build_tier3_context_ast_skeleton(monkeypatch: Any) -> None:
 from unittest.mock import MagicMock
 # Mock ASTParser
 mock_parser_instance = MagicMock()
 mock_parser_instance.get_skeleton.return_value = "def other():\n    ..."
 mock_parser_class = MagicMock(return_value=mock_parser_instance)
 # Mock file_cache.ASTParser in aggregate module
 monkeypatch.setattr("src.aggregate.ASTParser", mock_parser_class)
 file_items = [
  {"path": Path("other.py"), "entry": "other.py", "content": "def other():\n    pass", "error": False}
 ]
 history = []
 # New behavior check: it should use ASTParser for .py files not in focus
 result = build_tier3_context(file_items, Path("."), [], history, focus_files=[])
 assert "def other():" in result
 assert "..." in result
 assert "Python" not in result # summarize.py output should not be there if AST skeleton is used
 mock_parser_class.assert_called_once_with("python")
 mock_parser_instance.get_skeleton.assert_called_once_with("def other():\n    pass")

def test_build_tier3_context_exists() -> None:
 file_items = [
  {"path": Path("focus.py"), "entry": "focus.py", "content": "def focus():\n    pass", "error": False},
  {"path": Path("other.py"), "entry": "other.py", "content": "def other():\n    pass", "error": False}
 ]
 history = ["User: hello"]
 result = build_tier3_context(file_items, Path("."), [], history, focus_files=["focus.py"])
 assert "def focus():" in result
 assert "pass" in result
 # other.py should have skeletonized content, not full "pass" (if get_skeleton works)
 # However, for a simple "pass", the skeleton might be the same or similar.
 # Let's check for the header
 assert "other.py" in result
 assert "AST Skeleton" in result

def test_build_file_items_with_tiers(tmp_path: Any) -> None:
 from src.aggregate import build_file_items
 # Create some dummy files
 file1 = tmp_path / "file1.txt"
 file1.write_text("content1")
 file2 = tmp_path / "file2.txt"
 file2.write_text("content2")
 files_config = [
  "file1.txt",
  {"path": "file2.txt", "tier": 3}
 ]
 items = build_file_items(tmp_path, files_config)
 assert len(items) == 2
 item1 = next(i for i in items if i["entry"] == "file1.txt")
 assert item1["content"] == "content1"
 assert "tier" in item1
 assert item1["tier"] is None
 item2 = next(i for i in items if i["entry"] == "file2.txt")
 assert item2["content"] == "content2"
 assert item2["tier"] == 3

def test_build_files_section_with_dicts(tmp_path: Any) -> None:
 from src.aggregate import _build_files_section_from_items, build_file_items
 file1 = tmp_path / "file1.txt"
 file1.write_text("content1")
 files_config = [
  {"path": str(file1)}
 ]
 items = build_file_items(tmp_path, files_config)
 result = _build_files_section_from_items(items)
 assert "content1" in result
 assert "file1.txt" in result

def test_tiered_context_by_tier_field() -> None:
 file_items = [
  {"path": Path("tier1_file.txt"), "entry": "tier1_file.txt", "content": "Full Tier 1 Content\nLine 2", "tier": 1},
  {"path": Path("tier3_file.txt"), "entry": "tier3_file.txt", "content": "Full Tier 3 Content\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8\nLine 9\nLine 10", "tier": 3},
  {"path": Path("other.txt"), "entry": "other.txt", "content": "Other Content\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8\nLine 9\nLine 10", "tier": None}
 ]
 # Test Tier 3 Context
 result_t3 = build_tier3_context(file_items, Path("."), [], [], focus_files=[])
 assert "Full Tier 3 Content" in result_t3
 assert "Line 10" in result_t3 # In full
 # tier1_file.txt should be summarized
 assert "tier1_file.txt" in result_t3
 assert "preview:" in result_t3
 assert "Full Tier 1 Content" in result_t3 # It's short, so it's in preview
