from __future__ import annotations

import json
from copy import deepcopy
from pathlib import Path
from typing import Any


class LocalJsonStore:
    def __init__(self, path: str | Path) -> None:
        self.path = Path(path)
        self.path.parent.mkdir(parents=True, exist_ok=True)
        if not self.path.exists():
            self.write(_empty_state())

    def read(self) -> dict[str, Any]:
        try:
            return json.loads(self.path.read_text(encoding="utf-8"))
        except json.JSONDecodeError as exc:
            raise ValueError("local API store is not valid JSON") from exc

    def write(self, state: dict[str, Any]) -> None:
        self.path.write_text(json.dumps(state, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")

    def transaction(self) -> dict[str, Any]:
        return deepcopy(self.read())


def _empty_state() -> dict[str, Any]:
    return {
        "users": {},
        "api_sessions": {},
        "beta_invites": {},
        "invite_redemptions": {},
        "price_plans": {},
        "subscriptions": {},
        "pet_profiles": {},
        "pet_media": {},
        "pet_builds": {},
        "pet_packages": {},
        "provider_call_metrics": [],
        "orders": {},
        "webhook_events": {},
        "entitlements": {},
        "quota_buckets": {},
        "usage_ledger": [],
        "deletion_requests": {},
        "audit_logs": [],
        "build_queue": [],
        "events": [],
        "counters": {
            "pet": 0,
            "media": 0,
            "build": 0,
            "package": 0,
            "order": 0,
            "entitlement": 0,
            "subscription": 0,
            "invite": 0,
            "quota": 0,
            "usage": 0,
            "audit": 0,
            "webhook": 0,
            "event": 0,
        },
    }
