from __future__ import annotations from typing import Any from .capabilities import ModelCapabilityService from .collections import CollectionService from .engineering import EngineeringReviewService from .hydraulics import HydraulicResultReviewService from .hydrology import HydrologyReviewService from .layers import LayerService from .objects import ObjectService from .pond import PondReviewService from .project import ProjectService from .qaqc import QAQCService from .result_queries import ResultQueryService from .results import ResultService from .review_engine import GenericReviewEngine from .scenarios import ScenarioReviewService from .simulation import SimulationService from .storage import StorageReviewService from .topology import TopologyService class PCSWMMClient: """Generic facade over PCSWMM's injected ``pcpy`` object.""" def __init__(self, pcpy: Any): if pcpy is None: raise ValueError("The injected PCSWMM pcpy object is required.") self.pcpy = pcpy self.project = ProjectService(pcpy) self.collections = CollectionService(pcpy, self.project) self.layers = LayerService(pcpy, self.project) self.objects = ObjectService(self.collections) self.simulation = SimulationService(pcpy, self.project) self.results = ResultService(pcpy, self.project) self.result_queries = ResultQueryService(self.results) self.qaqc = QAQCService(self.layers) self.topology = TopologyService(self.objects) self.engineering = EngineeringReviewService( self.layers, self.objects, self.topology, ) self.hydrology = HydrologyReviewService( self.layers, self.objects, ) self.storage = StorageReviewService(self.objects) self.pond = PondReviewService(self.objects) self.scenarios = ScenarioReviewService(self.collections) self.hydraulics = HydraulicResultReviewService( self.collections, self.result_queries, ) self.capabilities = ModelCapabilityService(self.collections) self.review_engine = GenericReviewEngine( self.project, self.collections, self.capabilities, self.topology, self.engineering, self.hydrology, self.storage, self.scenarios, ) # Backward-compatible alias. self.review_report = self.review_engine def health(self) -> dict[str, Any]: return { "pcpy_type": str(type(self.pcpy)), "project_open": self.project.is_open, "project": self.project.summary() if self.project.is_open else None, "capabilities": ( self.capabilities.detect() if self.project.is_open else None ), }