"""基础测试 — 验证核心模块可以正确导入并初始化"""
import pytest
import uuid


def test_state_creation():
    from app.state import create_initial_state
    state = create_initial_state(
        user_request="Build a hello world API",
        repo_path="/tmp/test_repo",
        executor="claude",
    )
    assert state["user_request"] == "Build a hello world API"
    assert state["repo_path"] == "/tmp/test_repo"
    assert state["selected_executor"] == "claude"
    assert state["status"] == "pending"
    assert state["attempts"] == 0
    assert uuid.UUID(state["task_id"])  # valid UUID


def test_settings_load():
    from app.configs import settings
    # Should load without errors
    assert settings.default_executor in ("claude", "codex", "openhands", "gemini")
    assert settings.api_port > 0


def test_executor_registry():
    from app.executors import EXECUTOR_REGISTRY, get_executor
    assert "claude" in EXECUTOR_REGISTRY
    assert "codex" in EXECUTOR_REGISTRY
    assert "openhands" in EXECUTOR_REGISTRY
    assert "gemini" in EXECUTOR_REGISTRY

    # get_executor should return an instance
    ex = get_executor("claude", repo_path="/tmp")
    assert ex.name == "claude"


def test_sandbox_manager_init():
    import tempfile, os
    from app.tools.sandbox import SandboxManager
    with tempfile.TemporaryDirectory() as tmp:
        manager = SandboxManager(base_dir=tmp)
        assert manager.base_dir.exists()


def test_project_memory():
    import tempfile
    from app.memory.project_memory import ProjectMemory
    with tempfile.TemporaryDirectory() as tmp:
        mem = ProjectMemory(memory_dir=tmp)
        task_id = str(uuid.uuid4())
        state = {
            "task_id": task_id,
            "user_request": "test",
            "status": "completed",
            "architecture_plan": {},
            "test_result": {},
            "review_result": {},
            "diff_result": {},
        }
        assert mem.save_task(task_id, state)
        loaded = mem.load_task(task_id)
        assert loaded["task_id"] == task_id


def test_report_generator():
    import tempfile
    from app.tools.report_generator import ReportGenerator
    with tempfile.TemporaryDirectory() as tmp:
        gen = ReportGenerator(output_dir=tmp)
        state = {
            "task_id": str(uuid.uuid4()),
            "user_request": "Build a REST API",
            "selected_executor": "claude",
            "attempts": 1,
            "architecture_plan": {"overview": "Simple REST API"},
            "code_result": {"output": "Done", "files_changed": ["app.py"]},
            "test_result": {"passed": 5, "failed": 0, "coverage": "90%"},
            "review_result": {"bugs": [], "security": [], "suggestions": []},
            "diff_result": {"modified": ["app.py"], "added": [], "deleted": [], "diff_lines": {"added": 50, "removed": 10}},
        }
        report = gen.generate_engineering_report(state)
        assert "AI Engineering Report" in report
        assert "Build a REST API" in report


def test_supervisor_fallback():
    from app.agents.supervisor import SupervisorAgent
    from app.state import create_initial_state
    agent = SupervisorAgent()
    state = create_initial_state("Build a login system", "/tmp/repo")
    # Should work even without API key (fallback)
    result = agent._fallback_analysis(state)
    assert "tasks" in result
    assert len(result["tasks"]) > 0


def test_git_manager_init():
    import tempfile
    from app.tools.git_manager import GitManager
    with tempfile.TemporaryDirectory() as tmp:
        git = GitManager(tmp)
        assert not git.is_git_repo()  # fresh dir
        git.init()
        assert git.is_git_repo()
