from core.schemas.config import PluginPackagesConfig, ResolvedReportOutput from reporting.bootstrap import build_renderer_registry, build_transport_registry from reporting.models import AuditReport, ModuleAuditResult, PluginRuntimeError, RenderedReport from reporting.registry import RendererRegistry from reporting.transport_registry import TransportRegistry class ReportService: def __init__( self, renderer_registry: RendererRegistry | None = None, transport_registry: TransportRegistry | None = None, plugin_packages: PluginPackagesConfig | None = None, ) -> None: self._renderer_registry = renderer_registry or build_renderer_registry(plugin_packages) self._transport_registry = transport_registry or build_transport_registry(plugin_packages) def build_report( self, results: list[ModuleAuditResult], exit_code: int, plugin_errors: list[PluginRuntimeError] | None = None, ) -> AuditReport: return AuditReport(results=results, exit_code=exit_code, plugin_errors=plugin_errors or []) def render(self, report: AuditReport, report_config: ResolvedReportOutput) -> RenderedReport: renderer = self._renderer_registry.get(report_config.renderer.type) return renderer.render(report, report_config.renderer.config) def publish(self, report: AuditReport, report_config: ResolvedReportOutput) -> str: rendered_report = self.render(report, report_config) transport = self._transport_registry.get(report_config.transport.type) return transport.publish(rendered_report, report_config.transport) def publish_many(self, report: AuditReport, outputs: list[ResolvedReportOutput]) -> list[str]: return [self.publish(report, output) for output in outputs]