"""Phase 1.1 — Load the authorised Food-Ka SQLite snapshot (read-only) into Parquet tables. Nothing is modified in the snapshot. Output: data/interim/raw_{products,price_log,sync_log,product_links,off_cache}.parquet plus sources.parquet from the JSON registry. """ from __future__ import annotations import json, sqlite3 import pandas as pd from src.common import ROOT, SETTINGS, path, verify_snapshot, snapshot_db, get_logger, ledger, write_manifest log = get_logger("ingest") def main() -> None: digest = verify_snapshot() log.info("snapshot verified sha256=%s", digest[:16]) con = sqlite3.connect(f"file:{snapshot_db()}?mode=ro", uri=True) out = path("interim"); files = [] for t in ["products", "price_log", "sync_log", "product_links", "off_cache"]: df = pd.read_sql_query(f"SELECT * FROM {t}", con) f = out / f"raw_{t}.parquet"; df.to_parquet(f, index=False); files.append(f) log.info("%s: %d rows x %d cols", t, *df.shape) reg = json.loads((ROOT / SETTINGS["snapshot"]["sources_registry"]).read_text())["sources"] src = pd.DataFrame(reg); f = out / "sources.parquet"; src.to_parquet(f, index=False); files.append(f) log.info("sources registry: %d entries (%s)", len(src), src["status"].value_counts().to_dict()) write_manifest("ingest", files, {"snapshot_sha256": digest}) ledger("1", "load_snapshot", f"{len(files)} parquet files written to data/interim") if __name__ == "__main__": main()