import 'package:cake_wallet/core/validator.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cw_core/crypto_currency.dart';

class AmountValidator extends TextValidator {
  AmountValidator({required CryptoCurrency currency, bool isAutovalidate = false}) {
    symbolsAmountValidator =
        SymbolsAmountValidator(isAutovalidate: isAutovalidate);
    decimalAmountValidator = DecimalAmountValidator(currency: currency,isAutovalidate: isAutovalidate);
  }

  late final SymbolsAmountValidator symbolsAmountValidator;

  late final DecimalAmountValidator decimalAmountValidator;

  String? call(String? value) => symbolsAmountValidator(value) ?? decimalAmountValidator(value);
}

class SymbolsAmountValidator extends TextValidator {
  SymbolsAmountValidator({required bool isAutovalidate})
      : super(
      errorMessage: S.current.error_text_amount,
      pattern: _pattern(),
      isAutovalidate: isAutovalidate,
      minLength: 0,
      maxLength: 0);

  static String _pattern() => '^([0-9]+([.\,][0-9]+)?|[.\,][0-9]+)\$';
}

class DecimalAmountValidator extends TextValidator {
  DecimalAmountValidator({required CryptoCurrency currency, required bool isAutovalidate })
      : super(
            errorMessage: S.current.decimal_places_error,
            pattern: _pattern(currency),
            isAutovalidate: isAutovalidate,
            minLength: 0,
            maxLength: 0);

  static String _pattern(CryptoCurrency currency) {
    switch (currency) {
      case CryptoCurrency.xmr:
        return '^([0-9]+([.\,][0-9]{1,12})?|[.\,][0-9]{1,12})\$';
      case CryptoCurrency.btc:
        return '^([0-9]+([.\,][0-9]{1,8})?|[.\,][0-9]{1,8})\$';
      default:
        return '^([0-9]+([.\,][0-9]{1,12})?|[.\,][0-9]{1,12})\$';
    }
  }
}

class AllAmountValidator extends TextValidator {
  AllAmountValidator()
      : super(
            errorMessage: S.current.error_text_amount,
            pattern: S.current.all,
            minLength: 0,
            maxLength: 0);
}
