package org.apache.fineract.ui.online.loanaccounts.loanaccountlist;

import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.SearchView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;

import org.apache.fineract.R;
import org.apache.fineract.data.models.loan.LoanAccount;
import org.apache.fineract.ui.adapters.LoanAccountListAdapter;
import org.apache.fineract.ui.base.EndlessRecyclerViewScrollListener;
import org.apache.fineract.ui.base.FineractBaseActivity;
import org.apache.fineract.ui.base.FineractBaseFragment;
import org.apache.fineract.ui.base.OnItemClickListener;
import org.apache.fineract.ui.base.Toaster;
import org.apache.fineract.ui.online.loanaccounts.loanapplication.loanactivity.LoanApplicationActivity;
import org.apache.fineract.ui.online.loanaccounts.loandetails.CustomerLoanDetailsFragment;
import org.apache.fineract.utils.ConstantKeys;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

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

/**
 * @author Rajan Maurya
 *         On 07/07/17.
 */
public class LoanAccountsFragment extends FineractBaseFragment implements LoanAccountsContract.View,
        SwipeRefreshLayout.OnRefreshListener, OnItemClickListener {

    @BindView(R.id.rv_customers_loans)
    RecyclerView rvCustomerLoans;

    @BindView(R.id.swipe_container)
    SwipeRefreshLayout swipeRefreshLayout;

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

    @Inject
    LoanAccountsPresenter customerLoansPresenter;

    @Inject
    LoanAccountListAdapter customerLoanAdapter;

    View rootView;

    private String customerIdentifier;
    private List<LoanAccount> loanAccounts;

    public static LoanAccountsFragment newInstance(String customerIdentifier) {
        LoanAccountsFragment fragment = new LoanAccountsFragment();
        Bundle args = new Bundle();
        args.putString(ConstantKeys.CUSTOMER_IDENTIFIER, customerIdentifier);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            customerIdentifier = getArguments().getString(ConstantKeys.CUSTOMER_IDENTIFIER);
        }
        loanAccounts = new ArrayList<>();
    }

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

        showUserInterface();
        setHasOptionsMenu(true);

        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        customerLoansPresenter.fetchCustomerLoanAccounts(customerIdentifier, 0, false);
    }

    @Override
    public void onRefresh() {
        customerLoansPresenter.fetchCustomerLoanAccounts(customerIdentifier, 0, false);
    }

    @OnClick(R.id.btn_try_again)
    void onRetry() {
        rvCustomerLoans.setVisibility(View.GONE);
        layoutError.setVisibility(View.GONE);
        customerLoansPresenter.fetchCustomerLoanAccounts(customerIdentifier, 0, false);
    }

    @OnClick(R.id.fab_add_customer_loan)
    void createNewLoan() {
        Intent intent = new Intent(getActivity(), LoanApplicationActivity.class);
        intent.putExtra(ConstantKeys.CUSTOMER_IDENTIFIER, customerIdentifier);
        startActivity(intent);
    }

    @Override
    public void showUserInterface() {
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        rvCustomerLoans.setLayoutManager(layoutManager);
        rvCustomerLoans.setHasFixedSize(true);
        customerLoanAdapter.setOnItemClickListener(this);
        rvCustomerLoans.setAdapter(customerLoanAdapter);
        swipeRefreshLayout.setColorSchemeColors(getActivity()
                .getResources().getIntArray(R.array.swipeRefreshColors));
        swipeRefreshLayout.setOnRefreshListener(this);

        rvCustomerLoans.addOnScrollListener(new EndlessRecyclerViewScrollListener(layoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                customerLoansPresenter.fetchCustomerLoanAccounts(customerIdentifier, page, true);
            }
        });
    }

    @Override
    public void showLoanAccounts(List<LoanAccount> loanAccounts) {
        showRecyclerView(true);
        this.loanAccounts = loanAccounts;
        customerLoanAdapter.setCustomerLoanAccounts(loanAccounts);
    }

    @Override
    public void showMoreLoanAccounts(List<LoanAccount> loanAccounts) {
        showRecyclerView(true);
        this.loanAccounts.addAll(loanAccounts);
        customerLoanAdapter.setMoreCustomerLoanAccounts(loanAccounts);
    }

    @Override
    public void showEmptyLoanAccounts(String message) {
        showRecyclerView(false);
        showFineractEmptyUI(getString(R.string.loan_accounts), getString(R.string.loan_account),
                R.drawable.ic_payment_black_24dp);
    }

    @Override
    public void showRecyclerView(boolean status) {
        if (status) {
            rvCustomerLoans.setVisibility(View.VISIBLE);
            layoutError.setVisibility(View.GONE);
        } else {
            rvCustomerLoans.setVisibility(View.GONE);
            layoutError.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void showMessage(String message) {
        Toaster.show(rootView, message);
    }

    @Override
    public void showNoInternetConnection() {
        showRecyclerView(false);
        showFineractNoInternetUI();
    }

    @Override
    public void showError(String message) {
        showRecyclerView(false);
        showMessage(message);
        showFineractErrorUI(getString(R.string.loan_accounts));
    }

    @Override
    public void showProgressbar() {
        swipeRefreshLayout.setRefreshing(true);
    }

    @Override
    public void hideProgressbar() {
        swipeRefreshLayout.setRefreshing(false);
    }

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

    @Override
    public void onItemClick(View childView, int position) {
        ((FineractBaseActivity) getActivity()).replaceFragment(
                CustomerLoanDetailsFragment.newInstance(
                        loanAccounts.get(position).getProductIdentifier(),
                        loanAccounts.get(position).getIdentifier()), true, R.id.container);
    }

    @Override
    public void onItemLongPress(View childView, int position) {

    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_loan_account_search, menu);
        setUpSearchInterface(menu);
    }

    private void setUpSearchInterface(Menu menu) {
        SearchManager searchManager = (SearchManager) getActivity().
                getSystemService(Context.SEARCH_SERVICE);

        SearchView searchView = (SearchView) menu.findItem(R.id.loan_account_search)
                .getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity()
                .getComponentName()));

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                customerLoansPresenter.searchLoanAccounts(loanAccounts, query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if (TextUtils.isEmpty(newText)) {
                    searchedLoanAccounts(loanAccounts);
                }
                customerLoansPresenter.searchLoanAccounts(loanAccounts, newText);
                return false;
            }
        });

    }

    @Override
    public void searchedLoanAccounts(List<LoanAccount> loanAccountList) {
        customerLoanAdapter.setCustomerLoanAccounts(loanAccountList);
    }
}
