"""ArcGIS Submarine Cables Collector Collects submarine cable data from ArcGIS GeoJSON API. """ import json from typing import Dict, Any, List from datetime import datetime import httpx from app.services.collectors.base import BaseCollector from app.core.config import settings class ArcGISCableCollector(BaseCollector): name = "arcgis_cables" priority = "P1" module = "L2" frequency_hours = 168 data_type = "submarine_cable" @property def base_url(self) -> str: return settings.ARCGIS_CABLE_URL async def fetch(self) -> List[Dict[str, Any]]: params = {"where": "1=1", "outFields": "*", "returnGeometry": "true", "f": "geojson"} async with httpx.AsyncClient(timeout=60.0) as client: response = await client.get(self.base_url, params=params) response.raise_for_status() return self.parse_response(response.json()) def parse_response(self, data: Dict[str, Any]) -> List[Dict[str, Any]]: result = [] features = data.get("features", []) for feature in features: props = feature.get("properties", {}) geometry = feature.get("geometry", {}) route_coordinates = [] if geometry.get("type") == "MultiLineString": coords = geometry.get("coordinates", []) for line in coords: line_coords = [] for point in line: if len(point) >= 2: line_coords.append(point) if line_coords: route_coordinates.append(line_coords) elif geometry.get("type") == "LineString": coords = geometry.get("coordinates", []) line_coords = [] for point in coords: if len(point) >= 2: line_coords.append(point) if line_coords: route_coordinates.append(line_coords) try: entry = { "source_id": f"arcgis_cable_{props.get('cable_id', props.get('OBJECTID', ''))}", "name": props.get("Name", "Unknown"), "country": "", "city": "", "latitude": "", "longitude": "", "value": str(props.get("length", "")).replace(",", ""), "unit": "km", "metadata": { "cable_id": props.get("cable_id"), "owners": props.get("owners"), "rfs": props.get("rfs"), "status": "active", "year": props.get("year"), "url": props.get("url"), "color": props.get("color"), "route_coordinates": route_coordinates, }, "reference_date": datetime.utcnow().strftime("%Y-%m-%d"), } result.append(entry) except (ValueError, TypeError, KeyError): continue return result