"""Persist from a CLI owner, then observe the database without starting sources."""

from __future__ import annotations

import json
import subprocess
import sys
import tempfile
from datetime import UTC, datetime
from pathlib import Path


def main() -> None:
    """Exercise installed CLI + SQLite extras in separate real processes."""
    with tempfile.TemporaryDirectory(prefix="rpkiparrot-cli-persistence-") as temporary:
        directory = Path(temporary)
        source, database = directory / "source.json", directory / "cache.sqlite"
        source.write_text(
            json.dumps(
                {
                    "metadata": {"generated": int(datetime.now(UTC).timestamp())},
                    "roas": [{"prefix": "192.0.2.0/24", "maxLength": 24, "asn": "AS64496"}],
                    "aspas": [{"customer": "AS64496", "providers": ["AS64500"]}],
                }
            ),
            encoding="utf-8",
        )

        def invoke(arguments: list[str]) -> dict[str, object]:
            completed = subprocess.run(
                [sys.executable, "-I", "-m", "rpkiparrot", "--format", "json", *arguments],
                check=True,
                capture_output=True,
                text=True,
            )
            assert completed.stderr == ""
            print(completed.stdout, end="")
            result: dict[str, object] = json.loads(completed.stdout)
            return result

        saved = invoke(
            [
                "--json-file",
                str(source),
                "--max-age",
                "60",
                "sync",
                "--backend",
                "sqlite",
                "--db-path",
                str(database),
            ]
        )
        source.unlink()
        checked = invoke(["--database", str(database), "config", "check"])
        observed = invoke(["--database", str(database), "status"])
        validated = invoke(
            ["--database", str(database), "validate", "origin", "192.0.2.0/24", "64496"]
        )
        aspa = invoke(["--database", str(database), "query", "aspa", "64496", "--afi", "ipv4"])
        assert isinstance(aspa["data"], dict) and aspa["data"]["afi"] == 1
        assert set(aspa["data"]["providers"]) == {"64500"}
        assert isinstance(saved["data"], dict) and saved["data"]["persist_receipt"] is not None
        assert isinstance(checked["data"], dict) and checked["data"]["valid"]
        assert isinstance(observed["data"], dict)
        assert observed["data"]["upstream_id"] == saved["snapshot_id"]
        assert observed["snapshot_id"] != saved["snapshot_id"]
        assert isinstance(validated["data"], dict) and validated["data"]["status"] == "valid"


if __name__ == "__main__":
    main()
