import pytest
from pathlib import Path
from src import aggregate

def test_view_mode_summary(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 test_file.write_text("def hello():\n print('world')\n", encoding="utf-8")
 
 files = [{"path": "test.py", "view_mode": "summary"}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "summary"
 # Content should be a summary, which typically starts with **Python** or similar
 assert "**Python**" in items[0]["content"]
 assert "functions: hello" in items[0]["content"]

def test_view_mode_full(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 content = "def hello():\n print('world')\n"
 test_file.write_text(content, encoding="utf-8")
 
 files = [{"path": "test.py", "view_mode": "full"}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "full"
 assert items[0]["content"] == content

def test_view_mode_skeleton(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 content = "def hello():\n \"\"\"Docstring.\"\"\"\n print('world')\n"
 test_file.write_text(content, encoding="utf-8")
 
 files = [{"path": "test.py", "view_mode": "skeleton"}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "skeleton"
 # Skeleton should have '...' instead of 'print'
 assert "def hello():" in items[0]["content"]
 assert "Docstring" in items[0]["content"]
 assert "..." in items[0]["content"]
 assert "print('world')" not in items[0]["content"]

def test_view_mode_outline(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 content = "def hello():\n \"\"\"Docstring.\"\"\"\n print('world')\n"
 test_file.write_text(content, encoding="utf-8")
 
 files = [{"path": "test.py", "view_mode": "outline"}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "outline"
 # Outline should have [Func] hello (Lines 1-3)
 assert "[Func] hello (Lines 1-3)" in items[0]["content"]

def test_view_mode_none(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 test_file.write_text("def hello():\n print('world')\n", encoding="utf-8")
 
 files = [{"path": "test.py", "view_mode": "none"}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "none"
 assert items[0]["content"] == "(context excluded)"

def test_view_mode_default_summary(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 test_file.write_text("def hello():\n print('world')\n", encoding="utf-8")
 
 # Test with explicit summary mode
 files = [{"path": "test.py", "view_mode": "summary"}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "summary"
 assert "**Python**" in items[0]["content"]

def test_files_section_rendering(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 
 # Full item
 full_item = {
  "path": base_dir / "full.txt",
  "entry": "full.txt",
  "content": "Full content",
  "view_mode": "full",
  "auto_aggregate": True
 }
 
 # Summary item
 summary_item = {
  "path": base_dir / "summary.txt",
  "entry": "summary.txt",
  "content": "**Summary** content",
  "view_mode": "summary",
  "auto_aggregate": True
 }
 
 sections = aggregate._build_files_section_from_items([full_item, summary_item])
 
 # Full should be in backticks
 assert "### `full.txt`" in sections
 assert "```txt\nFull content\n```" in sections

 # Summary should NOT be in backticks
 assert "### `summary.txt`" in sections
 assert "```txt\n**Summary** content\n```" not in sections
 assert "**Summary** content" in sections

def test_view_mode_custom(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 content = "line1\nline2\nline3\nline4\nline5\n"
 test_file.write_text(content, encoding="utf-8")
 
 slices = [
  {"start_line": 1, "end_line": 2, "tag": "top", "comment": "header"},
  {"start_line": 4, "end_line": 5, "tag": "bottom", "comment": "footer"}
 ]
 files = [{"path": "test.py", "view_mode": "custom", "custom_slices": slices}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "custom"
 
 # Check formatting
 expected_1 = "---\n[Slice: top] (header)\nLines 1-2:\nline1\nline2"
 expected_2 = "---\n[Slice: bottom] (footer)\nLines 4-5:\nline4\nline5"
 assert expected_1 in items[0]["content"]
 assert expected_2 in items[0]["content"]
 assert "line3" not in items[0]["content"]

def test_view_mode_custom_empty_default_to_summary(tmp_path):
 base_dir = tmp_path / "project"
 base_dir.mkdir()
 test_file = base_dir / "test.py"
 test_file.write_text("def hello():\n print('world')\n", encoding="utf-8")
 
 files = [{"path": "test.py", "view_mode": "custom", "custom_slices": []}]
 items = aggregate.build_file_items(base_dir, files)
 
 assert len(items) == 1
 assert items[0]["view_mode"] == "custom"
 # Should default to summary
 assert "**Python**" in items[0]["content"]


