import 'package:flux/core/enums_and_consts/consts.dart';
import 'package:flux/features/tracking/models/tracking_model.dart';
import 'package:get_it/get_it.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class TrackingRepository {
  final SupabaseClient _supabase = GetIt.I.get<SupabaseClient>();

  TrackingRepository();

  /// Recupera la cronologia di un'entità (Ticket o Operazione)
  Future<List<TrackingModel>> getTrackingsByParent({
    required String parentId, // <-- Reso obbligatorio
    required TrackingParentType parentType, // <-- Reso obbligatorio
  }) async {
    // Facciamo la query con la JOIN per recuperare il nome dello staff al volo
    final response = await _supabase
        .from(Tables.trackings)
        .select('*, ${Tables.staffMembers}(name)')
        .eq('parent_id', parentId)
        .eq('parent_type', parentType.name)
        .order('created_at', ascending: false);

    return response.map((map) => TrackingModel.fromMap(map)).toList();
  }

  /// Inserisce un nuovo evento di tracking
  Future<void> logEvent(TrackingModel tracking) async {
    await _supabase.from(Tables.trackings).insert(tracking.toMap());
  }

  /// Metodo helper rapido per loggare un cambio di stato o una nota
  Future<void> logQuickEvent({
    required String companyId,
    required String message,
    required TrackingType type,
    required String parentId, // <-- Reso obbligatorio
    required TrackingParentType parentType, // <-- Reso obbligatorio
    String? staffId,
    bool isInternal = true,
  }) async {
    final log = TrackingModel(
      createdAt:
          DateTime.now(), // Questo verrà ignorato dal toMap in fase di insert, ma serve al modello
      companyId: companyId,
      staffId: staffId,
      parentId: parentId,
      parentType: parentType,
      eventType: type,
      isInternal: isInternal,
      message: message,
    );
    await logEvent(log);
  }
}
