"""Helpers for writing runtime configs and preprocessing bundles."""

from __future__ import annotations

import json
from pathlib import Path

from python_app.models.run_config_model import RunConfigModel, parse_combos_from_text
from python_app.orchestration.preprocess_assets import (
    PREPROCESS_ASSET_KEYS,
    PREPROCESS_ASSET_SPECS,
    preprocess_asset_model,
    runtime_preprocess_asset_keys,
)
from python_app.storage.npz_store import NpzStore


class ConfigWriter:
    """Write runtime artifacts consumed by C++ processes."""

    def __init__(self, runtime_dir: Path) -> None:
        """Create writer rooted at runtime directory."""
        self._runtime_dir = runtime_dir
        self._runtime_dir.mkdir(parents=True, exist_ok=True)

    def prepare_preprocess_bundles(
        self,
        store: NpzStore,
        radar_key: str,
        config: RunConfigModel,
    ) -> None:
        """Export selected preprocess sets into runtime bundles and update config paths."""
        for key in PREPROCESS_ASSET_KEYS:
            preprocess_asset_model(config, key).bundle_path = ""

        for key in runtime_preprocess_asset_keys(config):
            spec = PREPROCESS_ASSET_SPECS[key]
            asset = preprocess_asset_model(config, key)
            bundle_path = self._runtime_dir / spec.runtime_filename
            store.export_set_bundle(spec.set_kind, radar_key, asset.set_name, bundle_path)
            asset.bundle_path = str(bundle_path)

    def write(self, config: RunConfigModel, output_path: Path) -> Path:
        """Write run configuration JSON file."""
        output_path.parent.mkdir(parents=True, exist_ok=True)
        output_path.write_text(json.dumps(config.to_dict(), indent=2), encoding="utf-8")
        return output_path


__all__ = ["ConfigWriter", "parse_combos_from_text"]
