import 'package:equatable/equatable.dart';
import 'package:payment_plugin/domain/models/stored_payment_method.dart';

class PaymentCardsState extends Equatable {
  final bool isLoading;
  final bool hasError;
  final Iterable<StoredPaymentMethod> cards;
  final StoredPaymentMethod? selectedPaymentMethod;
  final bool missingPaymentMethod;

  const PaymentCardsState._({
    required this.cards,
    required this.isLoading,
    required this.hasError,
    this.selectedPaymentMethod,
    this.missingPaymentMethod = false,
  });

  PaymentCardsState.initial()
      : cards = [],
        isLoading = true,
        hasError = false,
        selectedPaymentMethod = null,
        missingPaymentMethod = false;

  PaymentCardsState cardsFetched(Iterable<StoredPaymentMethod> cards) {
    return _copyWith(cards: cards, isLoading: false);
  }

  PaymentCardsState cardsFetchedEmpty() {
    return _copyWith(cards: [], isLoading: false, hasCards: false);
  }

  PaymentCardsState cardsFetchedError() =>
      _copyWith(isLoading: false, hasError: true);

  PaymentCardsState loading(bool isLoading) {
    return _copyWith(isLoading: isLoading);
  }

  PaymentCardsState _copyWith({
    Iterable<StoredPaymentMethod>? cards,
    bool? isLoading,
    bool? hasError,
    bool? hasCards,
    StoredPaymentMethod? selectedPaymentMethod,
    bool? missingPaymentMethod,
  }) {
    return PaymentCardsState._(
      cards: cards ?? this.cards,
      isLoading: isLoading ?? this.isLoading,
      hasError: hasError ?? this.hasError,
      selectedPaymentMethod: selectedPaymentMethod ?? this.selectedPaymentMethod,
      missingPaymentMethod: missingPaymentMethod ?? this.missingPaymentMethod,
    );
  }

  PaymentCardsState paymentMethodSelected(StoredPaymentMethod? paymentMethod) {
    return _copyWith(selectedPaymentMethod: paymentMethod);
  }

  PaymentCardsState clearSelectedPaymentMethod() {
    return _copyWith(selectedPaymentMethod: null);
  }

  PaymentCardsState setMissingPaymentMethod(bool value) {
    return _copyWith(missingPaymentMethod: value);
  }

  @override
  List<Object?> get props => [isLoading, hasError, cards, selectedPaymentMethod, missingPaymentMethod];

}