import 'dart:convert';
import 'dart:math';

import 'package:cw_core/balance.dart';

class ERC20Balance extends Balance {
  ERC20Balance(this.balance, {this.exponent = 18})
      : super(balance.toInt(),
            balance.toInt());

  final BigInt balance;
  final int exponent;

  @override
  String get formattedAdditionalBalance {
    final String formattedBalance = (balance / BigInt.from(10).pow(exponent)).toString();
    return formattedBalance.substring(0, min(12, formattedBalance.length));
  }

  @override
  String get formattedAvailableBalance {
    final String formattedBalance = (balance / BigInt.from(10).pow(exponent)).toString();
    return formattedBalance.substring(0, min(12, formattedBalance.length));
  }

  String toJSON() => json.encode({
        'balanceInWei': balance.toString(),
        'exponent': exponent,
      });

  static ERC20Balance? fromJSON(String? jsonSource) {
    if (jsonSource == null) {
      return null;
    }

    final decoded = json.decode(jsonSource) as Map;

    try {
      return ERC20Balance(
        BigInt.parse(decoded['balanceInWei']),
        exponent: decoded['exponent'],
      );
    } catch (e) {
      return ERC20Balance(BigInt.zero);
    }
  }
}