"""GCP specific helper for syncing billing exports into MySQL.""" from __future__ import annotations from pathlib import Path from typing import Any, Dict, Iterable, Optional from common.mysql_writer import BillingDataUploader from gcp.account_details import load_active_accounts class GCPMySQLWriter: """Wraps the shared uploader with GCP friendly defaults.""" def __init__(self, config: Dict[str, Any]): settings = (config or {}).get("mysqlConfig", {}) or {} self.uploader = BillingDataUploader(provider="gcp", settings=settings) self.account_details_file = (config or {}).get("accountDetailsFile") self.active_projects = load_active_accounts(self.account_details_file) @property def enabled(self) -> bool: return self.uploader.enabled def sync( self, project_id: str, project_name: str, environment: str, records: Iterable[Dict[str, Any]], start_date, end_date, source_file: Optional[Path] = None, metadata: Optional[Dict[str, Any]] = None, ) -> None: if self.active_projects is not None and project_id not in self.active_projects: print(f"Skipping MySQL sync for inactive GCP account {project_id}") return metadata_payload = {"is_active": True} if metadata: metadata_payload.update(metadata) self.uploader.sync_account_costs( account_identifier=project_id, account_name=project_name or project_id, environment=environment, records=records, start_date=start_date.date() if hasattr(start_date, "date") else start_date, end_date=end_date.date() if hasattr(end_date, "date") else end_date, source_file=source_file, metadata=metadata_payload, )