import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/up_sales_processing_state.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:equatable/equatable.dart';

class UpSalesState extends Equatable {
  final bool selected;
  final List<AddOnUpgrade> addOnUpgrades;
  final List<RoomUpgrade> availableRoomUpgrades;
  final String selectedRoomUpgrade;
  final Exception? error;
  final bool isLoading;
  final bool termsAccepted;
  final UpSalesProcessingState processingState;

  const UpSalesState({
    required this.selected,
    required this.addOnUpgrades,
    required this.availableRoomUpgrades,
    required this.selectedRoomUpgrade,
    this.error,
    required this.isLoading,
    this.termsAccepted = false,
    required this.processingState,
  });

  @override
  List<Object?> get props => [
        selected,
        addOnUpgrades,
        availableRoomUpgrades,
        selectedRoomUpgrade,
        termsAccepted,
        isLoading,
        processingState
      ];

  UpSalesState.initial()
      : selected = false,
        addOnUpgrades = [],
        availableRoomUpgrades = [],
        selectedRoomUpgrade = '',
        error = null,
        isLoading = false,
        termsAccepted = false,
        processingState = UpSalesProcessingStateNotStarted();

  UpSalesState setupError({required Exception error}) =>
      copyWith(isLoading: false, error: error);

  UpSalesState loading() => copyWith(isLoading: true);

  UpSalesState preRegLoading() => copyWith(isLoading: true);

  UpSalesState loaded({required UpSales upSales}) =>
      copyWith(isLoading: false, availableRoomUpgrades: upSales.roomUpgrades);

  UpSalesState toggleSelectedAddonUpsale({required AddOnUpgrade upgrade}) {
    final upgradeIsSelected = upgrade.isSelected;
    final updatedUpgrade = upgrade.copyWith(isSelected: !upgradeIsSelected, quantity: 1);
    return updateUpgrade(updatedUpgrade);
  }

  UpSalesState toggleRoomUpgrade({required RoomUpgrade roomUpgrade}) {
    if (selectedRoomUpgrade == roomUpgrade.id) {
      return copyWith(selectedRoomUpgrade: '');
    } else {
      return copyWith(selectedRoomUpgrade: roomUpgrade.id);
    }
  }

  UpSalesState updateSelectedUpgradeWithQuantity(
    AddOnUpgrade upgrade,
    int quantity,
  ) {
    return updateUpgrade(upgrade.copyWith(quantity: quantity));
  }

  UpSalesState updateUpgrade(AddOnUpgrade upgrade) {
    final updatedAddOnUpgrades = addOnUpgrades.toList();
    final index = updatedAddOnUpgrades.indexWhere((e) => e.id == upgrade.id);
    if (index == -1) {
      updatedAddOnUpgrades.add(upgrade);
    } else {
      updatedAddOnUpgrades[index] = upgrade;
    }
    return copyWith(addOnUpgrades: updatedAddOnUpgrades);
  }

  UpSalesState processingStateUpdated(UpSalesProcessingState processingState) =>
      copyWith(processingState: processingState, error: Exception(""));

  UpSalesState copyWith({
    bool? selected,
    List<AddOnUpgrade>? addOnUpgrades,
    List<RoomUpgrade>? availableRoomUpgrades,
    String? selectedRoomUpgrade,
    bool? isLoading,
    Exception? error,
    bool? termsAccepted,
    UpSalesProcessingState? processingState,
  }) {
    return UpSalesState(
      selected: selected ?? this.selected,
      addOnUpgrades: addOnUpgrades ?? this.addOnUpgrades,
      availableRoomUpgrades:
          availableRoomUpgrades ?? this.availableRoomUpgrades,
      selectedRoomUpgrade: selectedRoomUpgrade ?? this.selectedRoomUpgrade,
      isLoading: isLoading ?? this.isLoading,
      error: error ?? this.error,
      termsAccepted: termsAccepted ?? this.termsAccepted,
      processingState: processingState ?? this.processingState,
    );
  }
}