package com.mercadopago.android.px.internal.viewmodel;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.widget.TextView;
import com.mercadopago.android.px.R;
import com.mercadopago.android.px.internal.util.TextUtil;
import com.mercadopago.android.px.internal.util.textformatter.AmountLabeledFormatter;
import com.mercadopago.android.px.internal.util.textformatter.TextFormatter;
import com.mercadopago.android.px.internal.view.PaymentMethodDescriptorView;
import com.mercadopago.android.px.model.AccountMoneyMetadata;
import com.mercadopago.android.px.model.Currency;
import java.math.BigDecimal;

public class AccountMoneyDescriptorModel extends PaymentMethodDescriptorView.Model {

    private final AccountMoneyMetadata accountMoneyMetadata;
    private final Currency currency;
    private final BigDecimal amountToPay;
    private String sliderTitle = TextUtil.EMPTY;
    private boolean showAmount = false;

    @NonNull
    public static PaymentMethodDescriptorView.Model createFrom(@NonNull final AccountMoneyMetadata accountMoneyMetadata,
        @NonNull final Currency currency, @NonNull final BigDecimal amountToPay) {
        return new AccountMoneyDescriptorModel(accountMoneyMetadata, currency, amountToPay);
    }

    /* default */ AccountMoneyDescriptorModel(@NonNull final AccountMoneyMetadata accountMoneyMetadata,
        @NonNull final Currency currency, @NonNull final BigDecimal amountToPay) {
        this.accountMoneyMetadata = accountMoneyMetadata;
        this.currency = currency;
        this.amountToPay = amountToPay;
    }

    @Override
    public void updateLeftSpannable(@NonNull final SpannableStringBuilder spannableStringBuilder,
        @NonNull final TextView textView) {

        final Context context = textView.getContext();

        if (showAmount) {
            updateInstallment(spannableStringBuilder, context, textView);
            spannableStringBuilder.append(TextUtil.SPACE);
        }

        if (accountMoneyMetadata.displayInfo != null) {
            sliderTitle = accountMoneyMetadata.displayInfo.sliderTitle;
            if (TextUtil.isEmpty(sliderTitle)) {
                spannableStringBuilder.append(TextUtil.SPACE);
            } else {
                final AmountLabeledFormatter amountLabeledFormatter =
                    new AmountLabeledFormatter(spannableStringBuilder, context)
                        .withTextColor(ContextCompat.getColor(context, R.color.ui_meli_grey));
                amountLabeledFormatter.apply(sliderTitle);
            }
        }
    }

    private void updateInstallment(@NonNull final SpannableStringBuilder spannableStringBuilder,
        @NonNull final Context context,
        @NonNull final TextView textView) {

        final Spannable amount = TextFormatter.withCurrency(currency)
            .amount(amountToPay)
            .normalDecimals()
            .into(textView)
            .toSpannable();

        new AmountLabeledFormatter(spannableStringBuilder, context)
            .withTextColor(ContextCompat.getColor(context, R.color.ui_meli_black))
            .withSemiBoldStyle()
            .apply(amount);
    }

    @Override
    public void formatForRemedy() {
        super.formatForRemedy();
        showAmount = true;
    }

    @Override
    protected String getAccessibilityContentDescription(@NonNull final Context context) {
        return sliderTitle;
    }
}