Files
deflock-app/lib/services/map_data_provider.dart
T
2025-08-09 14:04:31 -05:00

68 lines
2.3 KiB
Dart

import 'package:latlong2/latlong.dart';
import 'package:flutter_map/flutter_map.dart';
import '../models/camera_profile.dart';
import '../models/osm_camera_node.dart';
import '../app_state.dart';
import 'map_data_submodules/cameras_from_overpass.dart';
import 'map_data_submodules/tiles_from_osm.dart';
enum MapSource { local, remote, auto } // For future use
class OfflineModeException implements Exception {
final String message;
OfflineModeException(this.message);
@override
String toString() => 'OfflineModeException: $message';
}
class MapDataProvider {
static final MapDataProvider _instance = MapDataProvider._();
factory MapDataProvider() => _instance;
MapDataProvider._();
bool _offlineMode = false;
bool get isOfflineMode => _offlineMode;
void setOfflineMode(bool enabled) {
_offlineMode = enabled;
}
/// Fetch cameras from OSM/Overpass or local storage, depending on source/offline mode.
Future<List<OsmCameraNode>> getCameras({
required LatLngBounds bounds,
required List<CameraProfile> profiles,
UploadMode uploadMode = UploadMode.production,
MapSource source = MapSource.auto,
}) async {
// Resolve source:
if (_offlineMode && source != MapSource.local) {
throw OfflineModeException("Cannot fetch remote cameras in offline mode.");
}
if (source == MapSource.local) {
// TODO: implement local camera loading
throw UnimplementedError('Local camera loading not yet implemented.');
} else {
// Use Overpass remote fetch, from submodule:
return camerasFromOverpass(bounds: bounds, profiles: profiles, uploadMode: uploadMode);
}
}
/// Fetch tile image bytes from OSM or local (future). Only fetches, does not save!
Future<List<int>> getTile({
required int z,
required int x,
required int y,
MapSource source = MapSource.auto,
}) async {
print('[MapDataProvider] getTile called for $z/$x/$y');
if (_offlineMode && source != MapSource.local) {
throw OfflineModeException("Cannot fetch remote tiles in offline mode.");
}
if (source == MapSource.local) {
// TODO: implement local tile loading
throw UnimplementedError('Local tile loading not yet implemented.');
} else {
// Use OSM remote fetch from submodule:
return fetchOSMTile(z: z, x: x, y: y);
}
}
}