﻿from __future__ import annotations

import json
from dataclasses import asdict
from pathlib import Path

from .models import ResolvedTrack


class ResolvedTrackCache:
    def __init__(self, path: str | Path):
        self.path = Path(path)
        self._items = self._load()

    def get(self, thread_url: str) -> ResolvedTrack | None:
        item = self._items.get(thread_url)
        if not isinstance(item, dict):
            return None
        try:
            return ResolvedTrack(**item)
        except TypeError:
            return None

    def set(self, thread_url: str, track: ResolvedTrack) -> None:
        self._items[thread_url] = asdict(track)
        self.path.parent.mkdir(parents=True, exist_ok=True)
        tmp = self.path.with_suffix(self.path.suffix + ".tmp")
        tmp.write_text(json.dumps(self._items, ensure_ascii=False, indent=2), encoding="utf-8")
        tmp.replace(self.path)

    def _load(self) -> dict[str, dict[str, object]]:
        if not self.path.exists():
            return {}
        try:
            data = json.loads(self.path.read_text(encoding="utf-8"))
        except (OSError, json.JSONDecodeError):
            return {}
        return data if isinstance(data, dict) else {}
