import hashlib
import json
from pathlib import Path
from uuid import uuid4

from src.domain.codegen.port_adapter import (
    _gitignore_rule_wins,
    materialize_checkout_platform_lock,
)
from src.workers.project_setup_pipeline import _append_gitignore_extras


def test_project_setup_tracks_w4p_ownership_contract():
    root = Path("tests") / f".tmp-project-setup-{uuid4().hex}"
    root.mkdir()
    try:
        gitignore = root / ".gitignore"
        gitignore.write_text("p2hs/\n", encoding="utf-8")

        _append_gitignore_extras(str(root))

        body = gitignore.read_text(encoding="utf-8")
        for name in (
            "platform-ports.lock.json",
        ):
            assert f"!p2hs/{name}" in body
            assert _gitignore_rule_wins(body, f"!p2hs/{name}")
    finally:
        gitignore.unlink(missing_ok=True)
        root.rmdir()


def test_a_later_p2hs_ignore_does_not_keep_hiding_the_lock(tmp_path: Path):
    gitignore = tmp_path / ".gitignore"
    gitignore.write_text(
        "!p2hs/\np2hs/*\n!p2hs/platform-ports.lock.json\n"
        "!p2hs/\np2hs/*\n!p2hs/managed-runtime.json\n!p2hs/dependency-build.json\n",
        encoding="utf-8",
    )
    users = tmp_path / "functions" / "api" / "admin" / "users.js"
    users.parent.mkdir(parents=True)
    payload = b"export function onRequest() { return new Response('users') }\n"
    users.write_bytes(payload)

    changed = materialize_checkout_platform_lock(str(tmp_path), "nuxt_app")

    body = gitignore.read_text(encoding="utf-8")
    assert _gitignore_rule_wins(body, "!p2hs/platform-ports.lock.json")
    assert ".gitignore" in changed
    assert "p2hs/platform-ports.lock.json" in changed
    lock = json.loads((tmp_path / "p2hs" / "platform-ports.lock.json").read_text(encoding="utf-8"))
    assert lock["files"]["functions/api/admin/users.js"] == hashlib.sha256(payload).hexdigest()
    assert "/api/admin/users" in lock["routes"]
