from __future__ import annotations

import hashlib

from app.core.api.application.filesystem_snapshot_resolver import FilesystemSnapshotResolver


def test_augment_adds_untracked_files_from_filesystem(tmp_path) -> None:
    root = tmp_path / "repo"
    root.mkdir()
    docs = root / "docs" / "api"
    docs.mkdir(parents=True)
    control_path = docs / "control-actions-endpoint.md"
    control_content = "---\ndoc_type: api_method\n---\nGET|POST /actions/{action}\n"
    control_path.write_text(control_content, encoding="utf-8")

    incoming = [
        {
            "path": "docs/api/health-endpoint.md",
            "content": "health",
            "content_hash": hashlib.sha256(b"health").hexdigest(),
        }
    ]

    out = FilesystemSnapshotResolver().augment(project_id=str(root), files=incoming)
    paths = {item["path"] for item in out}
    assert "docs/api/health-endpoint.md" in paths
    assert "docs/api/control-actions-endpoint.md" in paths


def test_augment_prefers_request_payload_for_existing_path(tmp_path) -> None:
    root = tmp_path / "repo"
    root.mkdir()
    docs = root / "docs" / "api"
    docs.mkdir(parents=True)
    file_path = docs / "health-endpoint.md"
    file_path.write_text("from-disk", encoding="utf-8")

    incoming_content = "from-request"
    incoming = [
        {
            "path": "docs/api/health-endpoint.md",
            "content": incoming_content,
            "content_hash": hashlib.sha256(incoming_content.encode("utf-8")).hexdigest(),
        }
    ]

    out = FilesystemSnapshotResolver().augment(project_id=str(root), files=incoming)
    by_path = {item["path"]: item for item in out}
    assert by_path["docs/api/health-endpoint.md"]["content"] == incoming_content


def test_augment_ignores_files_outside_root_docs(tmp_path) -> None:
    root = tmp_path / "repo"
    root.mkdir()
    (root / "docs").mkdir()
    (root / "docs" / "README.md").write_text("docs", encoding="utf-8")
    (root / "src").mkdir()
    (root / "src" / "app.py").write_text("print('x')", encoding="utf-8")

    out = FilesystemSnapshotResolver().augment(project_id=str(root), files=[])
    paths = {item["path"] for item in out}
    assert "docs/README.md" in paths
    assert "src/app.py" not in paths


def test_augment_keeps_docs_when_request_uses_absolute_paths(tmp_path) -> None:
    root = tmp_path / "repo"
    root.mkdir()
    (root / "docs" / "api").mkdir(parents=True)
    (root / "docs" / "api" / "health-endpoint.md").write_text("disk", encoding="utf-8")

    absolute_docs = str(root / "docs" / "api" / "control-actions-endpoint.md")
    absolute_src = str(root / "src" / "app.py")
    incoming = [
        {"path": absolute_docs, "content": "req-doc", "content_hash": hashlib.sha256(b"req-doc").hexdigest()},
        {"path": absolute_src, "content": "req-src", "content_hash": hashlib.sha256(b"req-src").hexdigest()},
    ]

    out = FilesystemSnapshotResolver().augment(project_id=str(root), files=incoming)
    paths = {item["path"] for item in out}
    assert "docs/api/control-actions-endpoint.md" in paths
    assert "src/app.py" not in paths
