import 'dart:io';

import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/util.dart';

class _LayoutSizing {
  const _LayoutSizing();

  double get circularBorderRadius => 8.0;
  double get checkboxBorderRadius => 4.0;

  double get standardPadding => 16.0;
}

abstract class Constants {
  static const size = _LayoutSizing();

  static void exchangeForExperiencedUsers(int count) {
    enableExchange =
        Util.isDesktop || Platform.isAndroid || count > 5 || !Platform.isIOS;
  }

  static bool enableExchange = Util.isDesktop || !Platform.isIOS;
  static bool enableBuy = true; // true for development, TODO change to "Util.isDesktop || !Platform.isIOS;" as above or even just = enableExchange

  //TODO: correct for monero?
  static const int _satsPerCoinMonero = 1000000000000;
  static const int _satsPerCoinWownero = 100000000000;
  static const int _satsPerCoin = 100000000;
  static const int _decimalPlaces = 8;
  static const int _decimalPlacesWownero = 11;
  static const int _decimalPlacesMonero = 12;

  static const int notificationsMax = 0xFFFFFFFF;
  static const Duration networkAliveTimerDuration = Duration(seconds: 10);

  static const int pinLength = 4;

  // Enable Logger.print statements
  static const bool disableLogger = false;

  static const int currentHiveDbVersion = 4;

  static int satsPerCoin(Coin coin) {
    switch (coin) {
      case Coin.bitcoin:
      case Coin.litecoin:
      case Coin.litecoinTestNet:
      case Coin.bitcoincash:
      case Coin.bitcoincashTestnet:
      case Coin.dogecoin:
      case Coin.firo:
      case Coin.bitcoinTestNet:
      case Coin.dogecoinTestNet:
      case Coin.firoTestNet:
      case Coin.epicCash:
      case Coin.namecoin:
      case Coin.particl:
        return _satsPerCoin;

      case Coin.wownero:
        return _satsPerCoinWownero;

      case Coin.monero:
        return _satsPerCoinMonero;
    }
  }

  static int decimalPlacesForCoin(Coin coin) {
    switch (coin) {
      case Coin.bitcoin:
      case Coin.litecoin:
      case Coin.litecoinTestNet:
      case Coin.bitcoincash:
      case Coin.bitcoincashTestnet:
      case Coin.dogecoin:
      case Coin.firo:
      case Coin.bitcoinTestNet:
      case Coin.dogecoinTestNet:
      case Coin.firoTestNet:
      case Coin.epicCash:
      case Coin.namecoin:
      case Coin.particl:
        return _decimalPlaces;

      case Coin.wownero:
        return _decimalPlacesWownero;

      case Coin.monero:
        return _decimalPlacesMonero;
    }
  }

  static List<int> possibleLengthsForCoin(Coin coin) {
    final List<int> values = [];
    switch (coin) {
      case Coin.bitcoin:
      case Coin.litecoin:
      case Coin.litecoinTestNet:
      case Coin.bitcoincash:
      case Coin.bitcoincashTestnet:
      case Coin.dogecoin:
      case Coin.firo:
      case Coin.bitcoinTestNet:
      case Coin.dogecoinTestNet:
      case Coin.firoTestNet:
      case Coin.epicCash:
      case Coin.namecoin:
      case Coin.particl:
        values.addAll([24, 21, 18, 15, 12]);
        break;

      case Coin.monero:
        values.addAll([25]);
        break;
      case Coin.wownero:
        values.addAll([14, 25]);
        break;
    }
    return values;
  }

  static int targetBlockTimeInSeconds(Coin coin) {
    // TODO verify values
    switch (coin) {
      case Coin.bitcoin:
      case Coin.bitcoinTestNet:
        return 600;

      case Coin.bitcoincash:
      case Coin.bitcoincashTestnet:
        return 600;

      case Coin.dogecoin:
      case Coin.dogecoinTestNet:
        return 60;

      case Coin.litecoin:
      case Coin.litecoinTestNet:
        return 150;

      case Coin.firo:
      case Coin.firoTestNet:
        return 150;

      case Coin.epicCash:
        return 60;

      case Coin.monero:
        return 120;

      case Coin.wownero:
        return 120;

      case Coin.namecoin:
        return 600;

      case Coin.particl:
        return 600;
    }
  }

  static const int seedPhraseWordCountBip39 = 24;
  static const int seedPhraseWordCountMonero = 25;

  static const Map<int, String> monthMapShort = {
    1: 'Jan',
    2: 'Feb',
    3: 'Mar',
    4: 'Apr',
    5: 'May',
    6: 'Jun',
    7: 'Jul',
    8: 'Aug',
    9: 'Sep',
    10: 'Oct',
    11: 'Nov',
    12: 'Dec',
  };

  static const Map<int, String> monthMap = {
    1: 'January',
    2: 'February',
    3: 'March',
    4: 'April',
    5: 'May',
    6: 'June',
    7: 'July',
    8: 'August',
    9: 'September',
    10: 'October',
    11: 'November',
    12: 'December',
  };
}