"""Startup mirrors the registry; the registry webhook re-mirrors it."""
from __future__ import annotations

from fastapi.testclient import TestClient

from test_propose_vertical import app_with_fake_gitea, tmp_env  # noqa: F401


def test_startup_mirrors_registry_into_projects_and_deployment(app_with_fake_gitea):
    from app import db

    app, _ = app_with_fake_gitea
    with TestClient(app):
        prow = db.conn().execute(
            "SELECT content_repo FROM projects WHERE id='default'"
        ).fetchone()
        assert prow["content_repo"] == "meta"   # from the registry, not META_REPO
        # §22 three-tier: type now lives on the default collection.
        crow = db.conn().execute(
            "SELECT type FROM collections WHERE id='default'"
        ).fetchone()
        assert crow["type"] == "document"
        drow = db.conn().execute("SELECT name FROM deployment WHERE id=1").fetchone()
        assert drow["name"]  # deployment name mirrored from the registry


def test_registry_webhook_remirrors(app_with_fake_gitea):
    import hashlib
    import hmac
    import json as _json

    app, fake = app_with_fake_gitea
    with TestClient(app) as client:
        from app import db
        new_yaml = (
            "deployment:\n  name: OHM\n  tagline: Edited tagline\n"
            "projects:\n  - id: default\n    name: OHM\n    type: document\n"
            "    content_repo: meta\n    visibility: public\n"
        )
        fake.files[("wiggleverse", "registry", "main", "projects.yaml")] = {
            "content": new_yaml, "sha": "regsha2",
        }
        body = _json.dumps({"repository": {"full_name": "wiggleverse/registry"}}).encode()
        secret = "test-webhook-secret-for-signature-verification"
        sig = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
        r = client.post(
            "/api/webhooks/gitea",
            content=body,
            headers={"X-Gitea-Event": "push", "X-Gitea-Signature": sig,
                     "Content-Type": "application/json"},
        )
        assert r.status_code == 200
        tagline = db.conn().execute("SELECT tagline FROM deployment WHERE id=1").fetchone()["tagline"]
        assert tagline == "Edited tagline"
