from __future__ import annotations from collections.abc import Iterable from sqlalchemy import delete from sqlalchemy.orm import Session from rf4_research.gear_components import GearComponentIdentity from .models import CatchReport, CatchTackleComponent def replace_tackle_components( session: Session, report: CatchReport, components: Iterable[GearComponentIdentity], *, source_system: str | None, source_url: str | None = None, raw_payload: dict | None = None, ) -> None: """Replace the ordered evidence for a report while keeping imports idempotent.""" session.flush() session.execute( delete(CatchTackleComponent).where(CatchTackleComponent.catch_report_id == report.id) ) session.add_all( CatchTackleComponent( catch_report_id=report.id, role=component.role, position=component.position, raw_value=component.raw_value, source_system=source_system, source_external_id=component.source_external_id, source_url=source_url, raw_payload=raw_payload, ) for component in components )