"""Filesystem artifact storage linked to a run id."""

from __future__ import annotations

import json
from pathlib import Path
from typing import Any
from uuid import UUID

from packages.config import get_settings


class ArtifactStore:
    def __init__(self, base_dir: str | None = None) -> None:
        self.base_dir = Path(base_dir or get_settings().artifacts_dir)
        self.base_dir.mkdir(parents=True, exist_ok=True)

    def run_dir(self, run_id: UUID) -> Path:
        path = self.base_dir / str(run_id)
        path.mkdir(parents=True, exist_ok=True)
        return path

    def write_json(self, run_id: UUID, name: str, payload: Any) -> str:
        path = self.run_dir(run_id) / name
        if hasattr(payload, "model_dump"):
            data = payload.model_dump()
        else:
            data = payload
        path.write_text(json.dumps(data, indent=2), encoding="utf-8")
        return str(path)

    def read_json(self, run_id: UUID, name: str) -> Any:
        path = self.run_dir(run_id) / name
        return json.loads(path.read_text(encoding="utf-8"))

    def write_text(self, run_id: UUID, relative_path: str, content: str) -> str:
        path = self.run_dir(run_id) / relative_path
        path.parent.mkdir(parents=True, exist_ok=True)
        path.write_text(content, encoding="utf-8")
        return str(path)
