
from __future__ import annotations

import json
import os
import secrets
from pathlib import Path

from iai_mcp.crypto_key_watch import (
    check_crypto_key_file_rotation_event,
    sync_crypto_key_watcher_to_disk,
)
from iai_mcp.events import query_events
from iai_mcp.store import MemoryStore


def test_watcher_baseline_then_rotation_emits_event(tmp_path: Path) -> None:
    root = tmp_path / "w"
    root.mkdir()
    kpath = root / ".crypto.key"
    kpath.write_bytes(secrets.token_bytes(32))
    os.chmod(kpath, 0o600)
    store = MemoryStore(path=root, user_id="default")

    check_crypto_key_file_rotation_event(store)
    ev0 = query_events(store, kind="crypto_key_rotated", limit=10)
    assert len(ev0) == 0

    kpath.write_bytes(secrets.token_bytes(32))
    os.chmod(kpath, 0o600)
    check_crypto_key_file_rotation_event(store)
    ev1 = query_events(store, kind="crypto_key_rotated", limit=10)
    assert len(ev1) == 1

    check_crypto_key_file_rotation_event(store)
    ev2 = query_events(store, kind="crypto_key_rotated", limit=10)
    assert len(ev2) == 1


def test_sync_watcher_without_event(tmp_path: Path) -> None:
    root = tmp_path / "s"
    root.mkdir()
    kpath = root / ".crypto.key"
    kpath.write_bytes(secrets.token_bytes(32))
    os.chmod(kpath, 0o600)
    store = MemoryStore(path=root, user_id="default")
    sync_crypto_key_watcher_to_disk(store)
    wp = root / ".crypto-key-watcher.json"
    assert wp.is_file()
    data = json.loads(wp.read_text(encoding="utf-8"))
    assert "mtime_ns" in data and "size" in data
