import 'package:concierge/data/remote/api/concierge_service.dart';
import 'package:concierge/data/remote/models/area_details.dart';
import 'package:concierge/data/remote/models/order.dart';
import 'package:concierge/data/remote/models/product.dart';
import 'package:concierge/data/remote/models/property.dart';
import 'package:concierge/domain/models/delivery_location.dart';

class PropertyRepository {
  final ConciergeService _service;

  const PropertyRepository(this._service);

  Future<Property> getHotelOverview({required String hotelCode}) async {
    final response = await _service.getHotelOverview(hotelCode);
    return response.data;
  }

  Future<AreaDetails> getArea(int areaId) async {
    final response = await _service.getArea(areaId);
    return response.data;
  }

  Future<Product> getProduct(int productId) async {
    final response = await _service.getProduct(productId);
    return response.data;
  }

  Future<Order> createOrder({
    required List<Map<String, dynamic>> products,
    required int areaId,
    required String locationCode,
    required bool isDelivery,
    required String roomNumber,
    required String readyTime,
    required String comment,
    required bool chargeToRoom,
    required DeliveryLocation deliveryLocation,
  }) async {
    final body = {
      "products": products,
      "area_id": areaId,
      "delivery": isDelivery,
      "requested_delivery_time": readyTime.isEmpty ? "ASAP" : readyTime,
      "payment_type": chargeToRoom ? "ROOM" : "PAYMENT_SERVICE",
      "customer_comment": comment,
      "order_type": "PRODUCT"
    };
    if (deliveryLocation is Room) {
      body["room"] = roomNumber;
    } else if (deliveryLocation is Area) {
      body["location_code"] = locationCode;
    }
    final response = await _service.createOrder(body);
    return response.data;
  }

  Future<Order> getOrder(int id) async {
    final response = await _service.getOrder(id.toString());
    return response.data;
  }

  Future<List<Order>> getAllOrders() async {
    final response = await _service.getCustomerOrders();
    return response.data;
  }
}