import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/up_sales/mappers/up_sales_mapper.dart';
import 'package:comwell_key_app/up_sales/models/addon_list.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:flutter/foundation.dart';

class UpSalesRepository {
  final Api api = Api();

  UpSalesRepository();

  Future<UpSales> getRemoteUpSales(
      String confirmationId, String hotelCode) async {
    final response = await api.fetchUpSales(confirmationId, hotelCode);
    return response.toUpSales();
  }

  Future<UpSales> getUpSales(String confirmationId, String hotelCode) async {
    final upsales = await _checkIfUpSalesExists(confirmationId, hotelCode);
    if (upsales != null &&
        (upsales.roomUpgrades.isNotEmpty ||
            upsales.addOnUpgrades.isNotEmpty)) {
      return upsales;
    }
    final newUpsales =
        await _fetchAndSaveUpSalesToDatabase(confirmationId, hotelCode);
    return newUpsales;
  }

  Future<UpSales> _fetchAndSaveUpSalesToDatabase(
      String confirmationId, String hotelCode) async {
    try {
      final response = await api.fetchUpSales(confirmationId, hotelCode);
      await locator<ComwellDatabase>().upsalesDAO.insertUpsale(response);
      final upsales = response.toUpSales();
      debugPrint("Up sales saved to database: $upsales");
      return upsales;
    } on Exception catch (e) {
      debugPrint("Error fetching up sales: $e");
      rethrow;
    }
  }

  Future<UpSales?> _checkIfUpSalesExists(
      String confirmationId, String hotelCode) async {
    try {
      final upsales = await locator<ComwellDatabase>()
          .upsalesDAO
          .getUpsaleByConfirmationNumber(confirmationId);
      return upsales;
    } catch (e) {
      debugPrint("Error checking if up sales exists: $e");
      return null;
    }
  }

  Future<void> addUpSalesToBooking(String confirmationId, String hotelCode,
      String roomType, List<AddOnList> selectedUpSales) async {
    await api.addUpSalesToBooking(
        confirmationId, hotelCode, roomType, selectedUpSales);
  }
}