// Copyright © 2022 Olo Inc. All rights reserved. // This software is made available under the Olo Pay SDK License (See LICENSE.md file) package com.olopaysdkreactnative.data import com.facebook.react.bridge.ReadableMap import com.olo.olopay.data.CardBrand import com.olo.olopay.data.CardField import com.olo.olopay.data.ICardFieldState import com.olopaysdkreactnative.extensions.getNullableString data class CustomErrorMessages constructor( val invalidCardNumber: String?, val emptyCardNumber: String?, val unsupportedCardNumber: String?, val invalidExpiration: String?, val emptyExpiration: String?, val invalidCvv: String?, val emptyCvv: String?, val invalidPostalCode: String?, val emptyPostalCode: String?, ){ constructor(readableMap: ReadableMap): this( readableMap.getMap(DataKeys.NumberKey)?.getNullableString(DataKeys.InvalidErrorKey), readableMap.getMap(DataKeys.NumberKey)?.getNullableString(DataKeys.EmptyErrorKey), readableMap.getNullableString(DataKeys.UnsupportedCardError) , readableMap.getMap(DataKeys.ExpirationKey)?.getNullableString(DataKeys.InvalidErrorKey), readableMap.getMap(DataKeys.ExpirationKey)?.getNullableString(DataKeys.EmptyErrorKey), readableMap.getMap(DataKeys.CvvKey)?.getNullableString(DataKeys.InvalidErrorKey), readableMap.getMap(DataKeys.CvvKey)?.getNullableString(DataKeys.EmptyErrorKey), readableMap.getMap(DataKeys.PostalCodeKey)?.getNullableString(DataKeys.InvalidErrorKey), readableMap.getMap(DataKeys.PostalCodeKey)?.getNullableString(DataKeys.EmptyErrorKey), ) constructor(invalidCvvError: String?, emptyCvvError: String?): this( null, null, null, null, null, invalidCvvError, emptyCvvError, null, null, ) fun getCustomErrorMessage(ignoreUneditedFieldErrors: Boolean, cardFields: Map, cardBrand: CardBrand? = null): String? { val errorFields = getErrorFields(ignoreUneditedFieldErrors, cardFields) return when { errorFields.containsKey(CardField.CardNumber) -> { val state = errorFields[CardField.CardNumber]!! if(state.isEmpty) { emptyCardNumber } else if (cardBrand == CardBrand.Unsupported) { unsupportedCardNumber } else { invalidCardNumber } } errorFields.containsKey(CardField.Expiration) -> { if(errorFields[CardField.Expiration]!!.isEmpty) emptyExpiration else invalidExpiration } errorFields.containsKey(CardField.Cvv) -> { if (errorFields[CardField.Cvv]!!.isEmpty) emptyCvv else invalidCvv } errorFields.containsKey(CardField.PostalCode) -> { if (errorFields[CardField.PostalCode]!!.isEmpty) emptyPostalCode else invalidPostalCode } else -> { null } } } fun getErrorFields(ignoreUneditedFieldErrors: Boolean, cardFields: Map): Map { // Return all error fields regardless of state if (!ignoreUneditedFieldErrors) return cardFields.filterKeys { !cardFields[it]!!.isValid } return cardFields.filterKeys { val state = cardFields[it]!! !state.isValid && state.wasEdited && state.wasFocused } } }