package org.apache.fineract.ui.online.loanaccounts.loanapplication.loancosigner;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;

import com.stepstone.stepper.Step;
import com.stepstone.stepper.VerificationError;

import org.apache.fineract.R;
import org.apache.fineract.data.models.loan.CreditWorthinessSnapshot;
import org.apache.fineract.ui.base.FineractBaseActivity;
import org.apache.fineract.ui.base.Toaster;
import org.apache.fineract.ui.online.loanaccounts.loanapplication.BaseFragmentDebtIncome;
import org.apache.fineract.ui.online.loanaccounts.loanapplication.OnNavigationBarListener;

import java.util.List;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.OnClick;

/**
 * @author Rajan Maurya
 *         On 19/07/17.
 */
public class LoanCoSignerFragment extends BaseFragmentDebtIncome implements Step,
        LoanCoSignerContract.View {

    @BindView(R.id.et_customer)
    AutoCompleteTextView etCustomer;

    @BindView(R.id.iv_search_customer)
    ImageView ivSearchCustomer;

    @Inject
    LoanCoSignerPresenter loanCoSignerPresenter;

    View rootView;

    String[] customers;

    private OnNavigationBarListener.LoanCoSignerData onNavigationBarListener;

    public static LoanCoSignerFragment newInstance() {
        LoanCoSignerFragment fragment = new LoanCoSignerFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ((FineractBaseActivity) getActivity()).getActivityComponent().inject(this);
        loanCoSignerPresenter.attachView(this);
        rootView = view;
    }

    @OnClick(R.id.iv_search_customer)
    void searchCustomer() {
        if (TextUtils.isEmpty(etCustomer.getText().toString())) {
            Toaster.show(rootView, getString(R.string.customer_name_should_not_be_empty));
        } else {
            loanCoSignerPresenter.searchCustomer(etCustomer.getText().toString().trim());
        }
    }

    @Override
    protected int getFragmentLayout() {
        return R.layout.fragment_loan_co_signer;
    }

    @Override
    public VerificationError verifyStep() {
        CreditWorthinessSnapshot creditWorthinessSnapshot = getCreditWorthinessSnapshot();
        if (!TextUtils.isEmpty(etCustomer.getText().toString().trim()) && loanCoSignerPresenter
                .findCustomer(etCustomer.getText().toString().trim(), customers)) {
            creditWorthinessSnapshot.setForCustomer(etCustomer.getText().toString().trim());
        }
        onNavigationBarListener.setCoSignerDebtIncome(creditWorthinessSnapshot);
        return null;
    }

    @Override
    public void onSelected() {
    }

    @Override
    public void onError(@NonNull VerificationError error) {
    }

    @Override
    public void showCustomers(List<String> customer) {
        customers = customer.toArray(new String[0]);
        ArrayAdapter<String> customerAdapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, customers);
        etCustomer.setAdapter(customerAdapter);
        etCustomer.showDropDown();

    }

    @Override
    public void showProgressbar() {
        onNavigationBarListener.showProgressbar(getString(R.string.fetching_customer_please_wait));
    }

    @Override
    public void hideProgressbar() {
        onNavigationBarListener.hideProgressbar();
    }

    @Override
    public void showError(String message) {
        Toaster.show(rootView, getString(R.string.error_loading_customers));
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Activity activity = context instanceof Activity ? (Activity) context : null;
        try {
            onNavigationBarListener = (OnNavigationBarListener.LoanCoSignerData) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnNavigationBarListener.LoanCoSignerData");
        }
    }

}
