"""Package catalog safety checks."""

from __future__ import annotations

import sys
import unittest
from pathlib import Path
from types import SimpleNamespace

PROJECT_ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(PROJECT_ROOT))
loaded_platform = sys.modules.get("platform")
if loaded_platform is not None and not hasattr(loaded_platform, "__path__"):
    del sys.modules["platform"]

from platform.gateway.platform_api import _package_payload


def release(**overrides):
    values = {
        "package_id": "example_wp",
        "app_id": "example_app",
        "version": "1.0.0",
        "status": "published",
        "artifact_name": "example.zip",
        "artifact_size": 100,
        "sha256": "a" * 64,
        "signature": "signature",
        "signature_algorithm": "Ed25519",
        "compatibility_json": {
            "bridge": "0.2.0", "wordpress": "6.0", "php": "8.0",
            "plugin_file": "example-wp/example.php", "release_notes": ["Safe update"],
        },
        "capabilities_json": ["example.lookup"],
        "revoked_at": None,
        "revoked_reason": None,
    }
    values.update(overrides)
    return SimpleNamespace(**values)


class PackageCatalogChecks(unittest.TestCase):
    def test_active_release_has_generic_identity_and_download(self):
        payload = _package_payload(release())
        self.assertEqual("example-wp/example.php", payload["plugin_file"])
        self.assertFalse(payload["revoked"])
        self.assertIn("/download", payload["download_path"])

    def test_revoked_release_has_reason_and_no_download(self):
        payload = _package_payload(release(
            status="revoked", revoked_reason="Security issue",
        ))
        self.assertTrue(payload["revoked"])
        self.assertEqual("Security issue", payload["revoked_reason"])
        self.assertIsNone(payload["download_path"])


if __name__ == "__main__":
    unittest.main(verbosity=2)
