"""Command-line entrypoint for single-camera runs and daily batch processing.""" from __future__ import annotations import argparse from chicken_counter.batch_runner import run_daily_batch from chicken_counter.config import load_batch_config, load_camera_config from chicken_counter.pipeline import run_pipeline def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="Run the chicken counting pipeline.") subparsers = parser.add_subparsers(dest="command") run_parser = subparsers.add_parser("run", help="Run a single camera pipeline.") run_parser.add_argument("--config", required=True, help="Path to camera config YAML/JSON.") run_parser.add_argument("--camera-id", help="Camera ID when using a multi-camera config file.") batch_parser = subparsers.add_parser("batch", help="Run the daily Cycle7 multi-camera batch.") batch_parser.add_argument("--config", required=True, help="Path to batch config YAML/JSON.") batch_parser.add_argument( "--date", help="Processing date folder in YYYY-MM-DD format. Defaults to today.", ) parser.add_argument("--config", help=argparse.SUPPRESS) parser.add_argument("--camera-id", help=argparse.SUPPRESS) return parser def main() -> None: parser = build_parser() args = parser.parse_args() if args.command == "batch": settings = load_batch_config(args.config) run_daily_batch(settings, date=args.date) return if args.command == "run": config = load_camera_config(args.config, args.camera_id) result = run_pipeline(config) print( f"[done] camera={result.camera_id} total_entered={result.total_entered_count} " f"frames={result.frames_processed} reason={result.stopped_reason}" ) return if args.config: config = load_camera_config(args.config, args.camera_id) result = run_pipeline(config) print( f"[done] camera={result.camera_id} total_entered={result.total_entered_count} " f"frames={result.frames_processed} reason={result.stopped_reason}" ) return parser.print_help() if __name__ == "__main__": main()