package org.apache.fineract.ui.online.depositaccounts.depositaccountdetails;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import org.apache.fineract.R;
import org.apache.fineract.data.models.deposit.DepositAccount;
import org.apache.fineract.ui.base.FineractBaseActivity;
import org.apache.fineract.ui.base.FineractBaseFragment;
import org.apache.fineract.ui.base.Toaster;
import org.apache.fineract.ui.online.depositaccounts.createdepositaccount.DepositAction;
import org.apache.fineract.ui.online.depositaccounts.createdepositaccount.createdepositactivity.CreateDepositActivity;
import org.apache.fineract.utils.ConstantKeys;
import org.apache.fineract.utils.StatusUtils;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * @author Rajan Maurya
 *         On 12/07/17.
 */
public class DepositAccountDetailsFragment extends FineractBaseFragment
        implements DepositAccountDetailsContract.View {

    @BindView(R.id.cl_customer_deposit_details)
    CoordinatorLayout clCustomerDepositDetails;

    @BindView(R.id.tv_deposit_current_status)
    TextView tvDepositCurrentStatus;

    @BindView(R.id.iv_deposit_current_status)
    ImageView ivDepositCurrentStatus;

    @BindView(R.id.tv_account)
    TextView tvAccount;

    @BindView(R.id.tv_balance)
    TextView tvBalance;

    @BindView(R.id.tv_beneficiaries)
    TextView tvBeneficiaries;

    @BindView(R.id.layout_error)
    View layoutError;

    @BindView(R.id.fab_edit_deposit_account)
    FloatingActionButton fabEditDepositAccount;

    @Inject
    DepositAccountDetailsPresenter customerDepositDetailsPresenter;

    View rootView;

    private String accountIdentifier;
    private DepositAccount depositAccount;

    public static DepositAccountDetailsFragment newInstance(String accountIdentifier) {
        DepositAccountDetailsFragment fragment = new DepositAccountDetailsFragment();
        Bundle args = new Bundle();
        args.putString(ConstantKeys.ACCOUNT_IDENTIFIER, accountIdentifier);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            accountIdentifier = getArguments().getString(ConstantKeys.ACCOUNT_IDENTIFIER);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_customer_deposit_details, container, false);
        ((FineractBaseActivity) getActivity()).getActivityComponent().inject(this);
        ButterKnife.bind(this, rootView);
        initializeFineractUIErrorHandler(getActivity(), rootView);
        customerDepositDetailsPresenter.attachView(this);
        setToolbarTitle(getString(R.string.deposit_account));

        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        clCustomerDepositDetails.setVisibility(View.GONE);
        customerDepositDetailsPresenter.fetchDepositAccountDetails(accountIdentifier);
    }

    @OnClick(R.id.btn_try_again)
    void onRetry() {
        clCustomerDepositDetails.setVisibility(View.GONE);
        layoutError.setVisibility(View.GONE);
        customerDepositDetailsPresenter.fetchDepositAccountDetails(accountIdentifier);
    }

    @OnClick(R.id.fab_edit_deposit_account)
    void editDepositAccount() {
        Intent intent = new Intent(getActivity(), CreateDepositActivity.class);
        intent.putExtra(ConstantKeys.CUSTOMER_IDENTIFIER, depositAccount.getCustomerIdentifier());
        intent.putExtra(ConstantKeys.DEPOSIT_ACCOUNT, depositAccount);
        intent.putExtra(ConstantKeys.DEPOSIT_ACTION, DepositAction.EDIT);
        startActivity(intent);
    }

    @Override
    public void showDepositDetails(DepositAccount depositAccount) {
        this.depositAccount = depositAccount;
        clCustomerDepositDetails.setVisibility(View.VISIBLE);
        layoutError.setVisibility(View.GONE);

        StatusUtils.setDepositAccountStatusIcon(depositAccount.getState(),
                ivDepositCurrentStatus, getActivity());
        tvDepositCurrentStatus.setText(depositAccount.getState().name());
        tvAccount.setText(depositAccount.getAccountIdentifier());
        tvBalance.setText(String.valueOf(depositAccount.getBalance()));

        if (depositAccount.getBeneficiaries().size() == 0) {
            tvBeneficiaries.setText(R.string.no_beneficiary);
        } else {
            tvBeneficiaries.setText(depositAccount.getBeneficiaries().toString());
        }

        if (depositAccount.getState() == DepositAccount.State.PENDING) {
            fabEditDepositAccount.setVisibility(View.VISIBLE);
        } else {
            fabEditDepositAccount.setVisibility(View.GONE);
        }
    }

    @Override
    public void showProgressbar() {
        showMifosProgressBar();
    }

    @Override
    public void hideProgressbar() {
        hideMifosProgressBar();
    }

    @Override
    public void showNoInternetConnection() {
        clCustomerDepositDetails.setVisibility(View.GONE);
        layoutError.setVisibility(View.VISIBLE);
        showFineractNoInternetUI();
    }

    @Override
    public void showError(String message) {
        clCustomerDepositDetails.setVisibility(View.GONE);
        layoutError.setVisibility(View.VISIBLE);
        showFineractErrorUI(getString(R.string.deposit_account));
        Toaster.show(rootView, message);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        hideMifosProgressBar();
        customerDepositDetailsPresenter.detachView();
    }
}
