"""obdcore -- headless, vehicle-agnostic OBD-II acquisition core.

Vehicle data (PIDs, scaling, DTCs, presets) lives in JSON profiles under
profiles/ -- loaded at runtime, not hardcoded -- so the app works across
vehicles and others can contribute profiles.

    formula.py    safe A/B/... scaling-formula evaluator (no code execution)
    profile.py    load/save/list vehicle profiles (JSON)
    registry.py   PidRegistry / DtcDatabase model + lookups
    link.py       ElmLink ELM327 serial transport (+ MockLink in mock.py)
    scheduler.py  PollScheduler prioritized polling engine
    store.py      TimeSeriesStore ring buffers + record/replay

See ARCHITECTURE.md and profiles/README.md.
"""
from .registry import PidRegistry, DtcDatabase, Pid, Dtc
from .profile import (Profile, load_profile, save_profile, list_profiles,
                      profiles_dir, default_profile_path, load_default)
from .formula import compile_formula, FormulaError
from .store import TimeSeriesStore, CsvRecorder, replay_csv, export_csv
from .scheduler import PollScheduler

__all__ = [
    "PidRegistry", "DtcDatabase", "Pid", "Dtc",
    "Profile", "load_profile", "save_profile", "list_profiles",
    "profiles_dir", "default_profile_path", "load_default",
    "compile_formula", "FormulaError",
    "TimeSeriesStore", "CsvRecorder", "replay_csv", "export_csv", "PollScheduler",
]
