import 'package:flutter/foundation.dart';

import '../models/receivable_models.dart';
import '../models/shipment_models.dart';
import 'business_calendar_mapper.dart';
import 'receivable_repository.dart';
import 'shipment_repository.dart';

/// Result object describing a manual Google Calendar sync run.
class CalendarSyncDiagnosticsResult {
  const CalendarSyncDiagnosticsResult({
    required this.shipmentsSynced,
    required this.receivablesSynced,
    required this.errors,
  });

  final int shipmentsSynced;
  final int receivablesSynced;
  final List<String> errors;

  bool get hasErrors => errors.isNotEmpty;
}

/// Utility helper to trigger a full calendar sync for diagnostics or manual refresh.
class CalendarSyncDiagnostics {
  CalendarSyncDiagnostics({
    ShipmentRepository? shipmentRepository,
    ReceivableRepository? receivableRepository,
    BusinessCalendarMapper? calendarMapper,
  })  : _shipmentRepository = shipmentRepository ?? ShipmentRepository(),
        _receivableRepository = receivableRepository ?? ReceivableRepository(),
        _calendarMapper = calendarMapper ?? BusinessCalendarMapper();

  final ShipmentRepository _shipmentRepository;
  final ReceivableRepository _receivableRepository;
  final BusinessCalendarMapper _calendarMapper;

  Future<CalendarSyncDiagnosticsResult> runFullSync({bool includeSettledReceivables = true}) async {
    final errors = <String>[];
    List<Shipment> shipments = const [];
    List<ReceivableInvoiceSummary> receivables = const [];

    try {
      shipments = await _shipmentRepository.fetchShipments();
      await _calendarMapper.syncShipments(shipments);
    } catch (e, stack) {
      debugPrint('Calendar diagnostics: shipment sync failed: $e\n$stack');
      errors.add('出荷イベント同期に失敗: $e');
    }

    try {
      receivables = await _receivableRepository.fetchSummaries(includeSettled: includeSettledReceivables);
      await _calendarMapper.syncReceivables(receivables);
    } catch (e, stack) {
      debugPrint('Calendar diagnostics: receivable sync failed: $e\n$stack');
      errors.add('債権イベント同期に失敗: $e');
    }

    return CalendarSyncDiagnosticsResult(
      shipmentsSynced: shipments.length,
      receivablesSynced: receivables.length,
      errors: errors,
    );
  }
}
