createGeofence method

Future<Map<String, dynamic>> createGeofence({
  1. required String name,
  2. required List<List<double>> coordinates,
  3. required String webhookUrl,
})

Crea una nueva geocerca programáticamente.

coordinates es una lista de listas [lat, lng, lat, lng].

Implementation

Future<Map<String, dynamic>> createGeofence({
  required String name,
  required List<List<double>> coordinates,
  required String webhookUrl,
}) async {
  if (coordinates.length < 3) {
    throw Exception("GeoEngine: Se requieren al menos 3 puntos para un polígono");
  }

  // Convertir formato: Flutter [Lat, Lng] -> GeoJSON [Lng, Lat]
  // GeoJSON usa orden Longitud (X), Latitud (Y)
  final polygon = coordinates.map((p) => [p[1], p[0]]).toList();

  // Cerrar el polígono si no está cerrado
  if (polygon.first[0] != polygon.last[0] || polygon.first[1] != polygon.last[1]) {
    polygon.add(polygon.first);
  }

  final payload = {
    "name": name,
    "webhook_url": webhookUrl,
    "geojson": {
      "type": "Polygon",
      "coordinates": [polygon]
    }
  };

  final uri = Uri.parse('$managementUrl/geofences');

  try {
    final response = await _client.post(
      uri,
      headers: {
        'Content-Type': 'application/json',
        'X-API-Key': apiKey,
        'User-Agent': 'GeoEngineFlutter/1.0.0',
      },
      body: jsonEncode(payload),
    );

    if (response.statusCode >= 400) {
      throw Exception('GeoEngine Management Error (${response.statusCode}): ${response.body}');
    }

    return jsonDecode(response.body);
  } catch (e) {
    rethrow;
  }
}