import 'package:flutter/material.dart';
import 'package:terepi_seged/enums/layer_import_source_type.dart';
import 'package:terepi_seged/services/layer_import_service.dart';

class ImportedLayerMeta {
  final String id;
  final String name;
  final LayerImportSourceType sourceType;
  final String localPath; // fájl elérési út
  final String? storagePath; // Supabase Storage (megosztáskor)
  final bool isVisible;
  final int? projectId;
  final DateTime importedAt;
  final DateTime? syncedAt;
  final String? colorHex;
  final double? opacity;
  final double? strokeWidth;

  const ImportedLayerMeta(
      {required this.id,
      required this.name,
      required this.sourceType,
      required this.localPath,
      this.storagePath,
      this.isVisible = true,
      this.projectId,
      required this.importedAt,
      this.syncedAt,
      this.colorHex,
      this.opacity,
      this.strokeWidth});

  bool get isSynced => storagePath != null;

  Map<String, dynamic> toMap() => {
        'id': id,
        'name': name,
        'source_type': sourceType.name,
        'local_path': localPath,
        'storage_path': storagePath,
        'is_visible': isVisible ? 1 : 0,
        'project_id': projectId,
        'imported_at': importedAt.toIso8601String(),
        'synced_at': syncedAt?.toIso8601String(),
        if (colorHex != null) 'color_hex': colorHex,
        if (opacity != null) 'opacity': opacity,
        if (strokeWidth != null) 'stroke_width': strokeWidth
      };

  factory ImportedLayerMeta.fromMap(Map<String, dynamic> m) =>
      ImportedLayerMeta(
          id: m['id'] as String,
          name: m['name'] as String,
          sourceType:
              LayerImportSourceType.values.byName(m['source_type'] as String),
          localPath: m['local_path'] as String,
          storagePath: m['storage_path'] as String?,
          isVisible: (m['is_visible'] as int) == 1,
          projectId: m['project_id'] as int?,
          importedAt: DateTime.parse(m['imported_at'] as String),
          syncedAt: m['synced_at'] != null
              ? DateTime.parse(m['synced_at'] as String)
              : null,
          colorHex: m['color_hex'] as String?,
          opacity: (m['opacity'] as num?)?.toDouble(),
          strokeWidth: (m['stroke_width'] as num?)?.toDouble());

  ImportedLayerMeta copyWith({
    bool? isVisible,
    String? storagePath,
    DateTime? syncedAt,
    String? colorHex,
    double? opacity,
    double? strokeWidth,
  }) =>
      ImportedLayerMeta(
        id: id,
        name: name,
        sourceType: sourceType,
        localPath: localPath,
        storagePath: storagePath ?? this.storagePath,
        isVisible: isVisible ?? this.isVisible,
        projectId: projectId,
        importedAt: importedAt,
        syncedAt: syncedAt ?? this.syncedAt,
        colorHex: colorHex ?? this.colorHex,
        opacity: opacity ?? this.opacity,
        strokeWidth: strokeWidth ?? this.strokeWidth,
      );

  ImportedLayerStyle? getStyle() {
    if (colorHex == null) return null;
    final hex = colorHex!.replaceAll('#', '');
    final color = Color(int.parse('FF$hex', radix: 16));

    return ImportedLayerStyle(
        color: color,
        opacity: opacity ?? 0.35,
        strokeWidth: strokeWidth ?? 2.5);
  }
}
