// Importált réteg modellje.
// A GeoJsonParser közvetlenül flutter_map objektumokat gyárt,
// ezeket csomagoljuk egy kezelhető rétegbe.

import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:terepi_seged/enums/layer_import_source_type.dart';
import 'package:uuid/uuid.dart';

class ImportedLayer {
  final String id;
  final String name;
  final LayerImportSourceType sourceType;

  // flutter_map objektumok — közvetlenül a réteg widgetekbe kerülnek
  final List<Marker> markers;
  final List<Polyline> polylines;
  final List<Polygon> polygons;

  final bool isVisible;
  final DateTime importedAt;

  const ImportedLayer({
    required this.id,
    required this.name,
    required this.sourceType,
    required this.markers,
    required this.polylines,
    required this.polygons,
    this.isVisible = true,
    required this.importedAt,
  });

  // ── Statisztikák ──────────────────────────────────────────────────

  int get featureCount => markers.length + polylines.length + polygons.length;

  bool get isEmpty => featureCount == 0;

  // ── Bounding box — zoom a rétegre ─────────────────────────────────

  LatLngBounds? get bounds {
    final points = <LatLng>[
      ...markers.map((m) => m.point),
      ...polylines.expand((p) => p.points),
      ...polygons.expand((p) => p.points),
    ];
    if (points.isEmpty) return null;

    var minLat = points.first.latitude;
    var maxLat = points.first.latitude;
    var minLon = points.first.longitude;
    var maxLon = points.first.longitude;

    for (final p in points) {
      if (p.latitude < minLat) minLat = p.latitude;
      if (p.latitude > maxLat) maxLat = p.latitude;
      if (p.longitude < minLon) minLon = p.longitude;
      if (p.longitude > maxLon) maxLon = p.longitude;
    }

    return LatLngBounds(
      LatLng(minLat, minLon),
      LatLng(maxLat, maxLon),
    );
  }

  ImportedLayer copyWith({bool? isVisible}) => ImportedLayer(
        id: id,
        name: name,
        sourceType: sourceType,
        markers: markers,
        polylines: polylines,
        polygons: polygons,
        isVisible: isVisible ?? this.isVisible,
        importedAt: importedAt,
      );

  // ── Gyártó: GeoJsonParser kimenetéből ─────────────────────────────

  static ImportedLayer fromGeoJsonParser({
    required dynamic parser, // GeoJsonParser
    required String name,
    LayerImportSourceType source = LayerImportSourceType.geoJson,
  }) {
    return ImportedLayer(
      id: const Uuid().v4(),
      name: name,
      sourceType: source,
      markers: List.from(parser.markers as List),
      polylines: List.from(parser.polylines as List),
      polygons: List.from(parser.polygons as List),
      importedAt: DateTime.now(),
    );
  }
}
