import 'package:pshared/api/requests/wallet/create.dart';
import 'package:pshared/api/responses/wallet_balance.dart';
import 'package:pshared/api/responses/wallets.dart';
import 'package:pshared/data/dto/wallet/chain_asset.dart';
import 'package:pshared/data/mapper/describable.dart';
import 'package:pshared/data/mapper/payment/enums.dart';
import 'package:pshared/data/mapper/wallet/response.dart';
import 'package:pshared/models/currency.dart';
import 'package:pshared/models/describable.dart';
import 'package:pshared/models/payment/chain_network.dart';
import 'package:pshared/models/wallet/balance.dart';
import 'package:pshared/models/wallet/wallet.dart';
import 'package:pshared/service/authorization/service.dart';
import 'package:pshared/service/services.dart';
import 'package:pshared/utils/currency.dart';


class WalletService {
  static const String _objectType = Services.chainWallets;

  static Future<List<WalletModel>> list(String organizationRef) async {
    final json = await AuthorizationService.getGETResponse(
      _objectType,
      '/$organizationRef',
    );
    return WalletsResponse.fromJson(json).toDomain();
  }

  static Future<WalletBalance> getBalance({
    required String organizationRef,
    required String walletRef,
  }) async {
    final json = await AuthorizationService.getGETResponse(
      _objectType,
      '/$organizationRef/$walletRef/balance',
    );
    return WalletBalanceResponse.fromJson(json).toDomain();
  }

  static Future<void> create({
    required String organizationRef,
    required Describable describable,
    required ChainNetwork chain,
    required CurrencyCode currency,
    required String? ownerRef,
  }) async => AuthorizationService.getPOSTResponse(
    _objectType,
    '/$organizationRef',
    CreateWalletRequest(
      asset: ChainAssetDTO(
        chain: chainNetworkToValue(chain),
        tokenSymbol:
            money2CurrencyFromCode(currencyCodeToString(currency))?.isoCode ??
            currencyCodeToString(currency),
      ),
      describable: describable.toDTO(),
      ownerRef: ownerRef,
    ).toJson(),
  );
}
