import 'package:pshared/data/dto/payment/card.dart'; import 'package:pshared/data/dto/payment/card_token.dart'; import 'package:pshared/data/dto/payment/endpoint.dart'; import 'package:pshared/data/dto/payment/external_chain.dart'; import 'package:pshared/data/dto/payment/ledger.dart'; import 'package:pshared/data/dto/payment/managed_wallet.dart'; import 'package:pshared/data/mapper/payment/asset.dart'; import 'package:pshared/data/mapper/payment/type.dart'; import 'package:pshared/models/payment/methods/card.dart'; import 'package:pshared/models/payment/methods/card_token.dart'; import 'package:pshared/models/payment/methods/crypto_address.dart'; import 'package:pshared/models/payment/methods/data.dart'; import 'package:pshared/models/payment/methods/ledger.dart'; import 'package:pshared/models/payment/methods/managed_wallet.dart'; import 'package:pshared/models/payment/type.dart'; extension PaymentMethodDataEndpointMapper on PaymentMethodData { PaymentEndpointDTO toDTO() { final metadata = this.metadata; switch (type) { case PaymentType.ledger: final payload = this as LedgerPaymentMethod; return PaymentEndpointDTO( type: paymentTypeToValue(type), data: LedgerEndpointDTO( ledgerAccountRef: payload.ledgerAccountRef, contraLedgerAccountRef: payload.contraLedgerAccountRef, ).toJson(), metadata: metadata, ); case PaymentType.managedWallet: final payload = this as ManagedWalletPaymentMethod; return PaymentEndpointDTO( type: paymentTypeToValue(type), data: ManagedWalletEndpointDTO( managedWalletRef: payload.managedWalletRef, asset: payload.asset?.toDTO(), ).toJson(), metadata: metadata, ); case PaymentType.externalChain: final payload = this as CryptoAddressPaymentMethod; return PaymentEndpointDTO( type: paymentTypeToValue(type), data: ExternalChainEndpointDTO( asset: payload.asset?.toDTO(), address: payload.address, memo: payload.memo, ).toJson(), metadata: metadata, ); case PaymentType.card: final payload = this as CardPaymentMethod; return PaymentEndpointDTO( type: paymentTypeToValue(type), data: CardEndpointDTO( pan: payload.pan, expMonth: payload.expMonth, expYear: payload.expYear, country: payload.country, firstName: payload.firstName, lastName: payload.lastName, ).toJson(), metadata: metadata, ); case PaymentType.cardToken: final payload = this as CardTokenPaymentMethod; return PaymentEndpointDTO( type: paymentTypeToValue(type), data: CardTokenEndpointDTO( token: payload.token, maskedPan: payload.maskedPan, ).toJson(), metadata: metadata, ); default: throw UnsupportedError('Unsupported payment endpoint type: $type'); } } } extension PaymentEndpointDTOMapper on PaymentEndpointDTO { PaymentMethodData toDomain() { final metadata = this.metadata; switch (paymentTypeFromValue(type)) { case PaymentType.ledger: final payload = LedgerEndpointDTO.fromJson(data); return LedgerPaymentMethod( ledgerAccountRef: payload.ledgerAccountRef, contraLedgerAccountRef: payload.contraLedgerAccountRef, metadata: metadata, ); case PaymentType.managedWallet: final payload = ManagedWalletEndpointDTO.fromJson(data); return ManagedWalletPaymentMethod( managedWalletRef: payload.managedWalletRef, asset: payload.asset?.toDomain(), metadata: metadata, ); case PaymentType.externalChain: final payload = ExternalChainEndpointDTO.fromJson(data); return CryptoAddressPaymentMethod( asset: payload.asset?.toDomain(), address: payload.address, memo: payload.memo, metadata: metadata, ); case PaymentType.card: final payload = CardEndpointDTO.fromJson(data); return CardPaymentMethod( pan: payload.pan, firstName: payload.firstName, lastName: payload.lastName, expMonth: payload.expMonth, expYear: payload.expYear, country: payload.country, metadata: metadata, ); case PaymentType.cardToken: final payload = CardTokenEndpointDTO.fromJson(data); return CardTokenPaymentMethod( token: payload.token, maskedPan: payload.maskedPan, metadata: metadata, ); default: throw UnsupportedError('Unsupported payment endpoint type: ${paymentTypeFromValue(type)}'); } } }