import 'package:cake_wallet/entities/template.dart';
import 'package:cake_wallet/view_model/send/output.dart';
import 'package:mobx/mobx.dart';
import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/crypto_currency.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
import 'package:cake_wallet/store/settings_store.dart';

part 'template_view_model.g.dart';

class TemplateViewModel = TemplateViewModelBase with _$TemplateViewModel;

abstract class TemplateViewModelBase with Store {
  final WalletBase _wallet;
  final SettingsStore _settingsStore;
  final FiatConversionStore _fiatConversationStore;

  TemplateViewModelBase({
    required WalletBase wallet,
    required SettingsStore settingsStore,
    required FiatConversionStore fiatConversationStore,
  })  : _wallet = wallet,
        _settingsStore = settingsStore,
        _fiatConversationStore = fiatConversationStore,
        _currency = wallet.currency,
        output = Output(wallet, settingsStore, fiatConversationStore, () => wallet.currency) {
    output = Output(_wallet, _settingsStore, _fiatConversationStore, () => _currency);
  }

  @observable
  Output output;

  @observable
  String name = '';

  @observable
  String address = '';

  @observable
  CryptoCurrency _currency;

  @observable
  bool isCurrencySelected = true;

  @observable
  bool isFiatSelected = false;

  @action
  void selectCurrency() {
    isCurrencySelected = true;
    isFiatSelected = false;
  }

  @action
  void selectFiat() {
    isFiatSelected = true;
    isCurrencySelected = false;
  }

  @action
  void reset() {
    name = '';
    address = '';
    isCurrencySelected = true;
    isFiatSelected = false;
    output.reset();
  }

  Template toTemplate({required String cryptoCurrency, required String fiatCurrency}) {
    return Template(
        isCurrencySelectedRaw: isCurrencySelected,
        nameRaw: name,
        addressRaw: address,
        cryptoCurrencyRaw: cryptoCurrency,
        fiatCurrencyRaw: fiatCurrency,
        amountRaw: output.cryptoAmount,
        amountFiatRaw: output.fiatAmount);
  }

  @action
  void changeSelectedCurrency(CryptoCurrency currency) {
    isCurrencySelected = true;
    _currency = currency;
  }

  @computed
  CryptoCurrency get selectedCurrency => _currency;
}