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

import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.widget.NestedScrollView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.gson.Gson;

import org.apache.fineract.R;
import org.apache.fineract.data.models.loan.LoanAccount;
import org.apache.fineract.data.models.loan.PaymentCycle;
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.loanaccounts.debtincomereport.DebtIncomeReportActivity;
import org.apache.fineract.ui.online.loanaccounts.plannedpayment.PlannedPaymentActivity;
import org.apache.fineract.utils.ConstantKeys;
import org.apache.fineract.utils.DateUtils;
import org.apache.fineract.utils.StatusUtils;
import org.apache.fineract.utils.Utils;

import javax.inject.Inject;

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

/**
 * @author Rajan Maurya
 *         On 11/07/17.
 */
public class CustomerLoanDetailsFragment extends FineractBaseFragment implements
        CustomerLoanDetailsContract.View {

    @BindView(R.id.iv_loan_current_status)
    ImageView ivLoanCurrentStatus;

    @BindView(R.id.tv_principal_amount)
    TextView tvPaymentAmount;

    @BindView(R.id.tv_repayment_cycle)
    TextView tvPaymentCycle;

    @BindView(R.id.tv_term)
    TextView tvTerm;

    @BindView(R.id.cl_alert_message)
    CoordinatorLayout clAlertMessage;

    @BindView(R.id.tv_loan_current_status)
    TextView tvLoanCurrentStatus;

    @BindView(R.id.ncv_customer_loan_details)
    NestedScrollView ncvCustomerLoanDetails;

    @BindView(R.id.layout_disburse_btn)
    RelativeLayout layoutDisburseButton;

    @BindView(R.id.tv_alert_text_1)
    TextView tvAlertText1;

    @BindView(R.id.tv_alert_text_2)
    TextView tvAlertText2;

    @BindView(R.id.tv_customer_deposit_account)
    TextView tvCustomerDepositAccount;

    @BindView(R.id.tv_create_by)
    TextView tvCreatedBy;

    @BindView(R.id.tv_last_modified_by)
    TextView tvLastModifiedBy;

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

    @Inject
    CustomerLoanDetailsPresenter customerLoanDetailsPresenter;

    View rootView;

    private String productIdentifier;
    private String caseIdentifier;
    private LoanAccount loanAccount;
    private String[] weeksName, repayOnMonths, timeSlots, monthsName;

    public static CustomerLoanDetailsFragment newInstance(String productIdentifier,
            String caseIdentifier) {
        CustomerLoanDetailsFragment fragment = new CustomerLoanDetailsFragment();
        Bundle args = new Bundle();
        args.putString(ConstantKeys.PRODUCT_IDENTIFIER, productIdentifier);
        args.putString(ConstantKeys.CASE_IDENTIFIER, caseIdentifier);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            productIdentifier = getArguments().getString(ConstantKeys.PRODUCT_IDENTIFIER);
            caseIdentifier = getArguments().getString(ConstantKeys.CASE_IDENTIFIER);
        }
        weeksName = getActivity().getResources().getStringArray(R.array.week_names);
        repayOnMonths = getActivity().getResources().getStringArray(R.array.repay_on_months);
        timeSlots = getActivity().getResources().getStringArray(R.array.time_slots);
        monthsName = getActivity().getResources().getStringArray(R.array.month_names);
        setHasOptionsMenu(true);
    }

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

        customerLoanDetailsPresenter.fetchCustomerLoanDetails(productIdentifier, caseIdentifier);

        return rootView;
    }

    @OnClick(R.id.btn_try_again)
    void tryAgainOnError() {
        ncvCustomerLoanDetails.setVisibility(View.GONE);
        layoutError.setVisibility(View.GONE);
        customerLoanDetailsPresenter.fetchCustomerLoanDetails(productIdentifier, caseIdentifier);
    }

    @OnClick(R.id.ll_planned_payment)
    void showPlannedPayment() {
        Intent intent = new Intent(getActivity(), PlannedPaymentActivity.class);
        intent.putExtra(ConstantKeys.PRODUCT_IDENTIFIER, productIdentifier);
        intent.putExtra(ConstantKeys.CASE_IDENTIFIER, caseIdentifier);
        startActivity(intent);
    }

    @OnClick(R.id.ll_debt_income_report)
    void showDebtIncomeReport() {
        Intent intent = new Intent(getActivity(), DebtIncomeReportActivity.class);
        intent.putExtra(ConstantKeys.LOAN_CREDITWORTHINESSSNAPSHOTS, (new Gson()).toJson(
                loanAccount.getLoanParameters().getCreditWorthinessSnapshots()));
        startActivity(intent);
    }

    @Override
    public void showLoanAccountDetails(LoanAccount loanAccount) {
        this.loanAccount = loanAccount;
        ncvCustomerLoanDetails.setVisibility(View.VISIBLE);
        layoutError.setVisibility(View.GONE);
        setToolbarTitle(loanAccount.getIdentifier());

        tvPaymentAmount.setText(
                String.valueOf(loanAccount.getLoanParameters().getMaximumBalance()));
        String term = loanAccount.getLoanParameters().getTermRange().getMaximum() + " " +
                loanAccount.getLoanParameters().getTermRange().getTemporalUnit();
        tvTerm.setText(term);

        PaymentCycle paymentCycle = loanAccount.getLoanParameters().getPaymentCycle();
        LoanAccount.RepayUnitType repayUnitType =
                LoanAccount.RepayUnitType.valueOf(paymentCycle.getTemporalUnit());
        switch (repayUnitType) {
            case WEEKS:
                tvPaymentCycle.setText(
                        getString(R.string.payment_cycle_week, paymentCycle.getPeriod(),
                                paymentCycle.getTemporalUnit().toLowerCase(),
                                weeksName[paymentCycle.getAlignmentDay()]));
                break;
            case MONTHS:
                if (paymentCycle.getAlignmentWeek() == null) {
                    tvPaymentCycle.setText(
                            getString(R.string.payment_cycle_month_day, paymentCycle.getPeriod(),
                                    paymentCycle.getTemporalUnit().toLowerCase(),
                                    repayOnMonths[paymentCycle.getAlignmentDay()]));
                } else {
                    tvPaymentCycle.setText(
                            getString(R.string.payment_cycle_month_day_week,
                                    paymentCycle.getPeriod(),
                                    paymentCycle.getTemporalUnit().toLowerCase(),
                                    timeSlots[paymentCycle.getAlignmentWeek()],
                                    weeksName[paymentCycle.getAlignmentDay()]));
                }
                break;
            case YEARS:
                if (paymentCycle.getAlignmentWeek() == null) {
                    tvPaymentCycle.setText(
                            getString(R.string.payment_cycle_month_day, paymentCycle.getPeriod(),
                                    paymentCycle.getTemporalUnit().toLowerCase(),
                                    repayOnMonths[paymentCycle.getAlignmentDay()]));
                } else {
                    tvPaymentCycle.setText(
                            getString(R.string.payment_cycle_year_day_week,
                                    paymentCycle.getPeriod(),
                                    paymentCycle.getTemporalUnit().toLowerCase(),
                                    timeSlots[paymentCycle.getAlignmentWeek()],
                                    weeksName[paymentCycle.getAlignmentDay()],
                                    monthsName[paymentCycle.getAlignmentMonth()]));
                }
                break;
        }

        tvLoanCurrentStatus.setText(loanAccount.getCurrentState().name());
        StatusUtils.setLoanAccountStatusIcon(loanAccount.getCurrentState(),
                ivLoanCurrentStatus, getActivity());

        if (loanAccount.getCurrentState() == LoanAccount.State.APPROVED) {
            clAlertMessage.setVisibility(View.VISIBLE);
            tvAlertText1.setText(getString(R.string.customer_loan_approved));
            tvAlertText2.setText(getString(R.string.to_activate_loan_disburse));
        }

        if (loanAccount.getAccountAssignments().size() != 0) {
            tvCustomerDepositAccount.setText(
                    loanAccount.getAccountAssignments().get(0).getAccountIdentifier());
        } else {
            tvCustomerDepositAccount.setText(R.string.no_deposit_account);
        }

        tvCreatedBy.setText(getString(R.string.loan_created_by, loanAccount.getCreatedBy(),
                DateUtils.getDateTime(loanAccount.getCreatedOn())));

        tvLastModifiedBy.setText(getString(R.string.loan_last_modified_by,
                loanAccount.getLastModifiedBy(),
                DateUtils.getDateTime(loanAccount.getLastModifiedOn())));
    }

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

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

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

    @Override
    public void showError(String message) {
        ncvCustomerLoanDetails.setVisibility(View.GONE);
        layoutError.setVisibility(View.VISIBLE);
        showFineractErrorUI(getString(R.string.loan_account));
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_loan_account_details, menu);
        Utils.setToolbarIconColor(getActivity(), menu, R.color.white);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_loan_account_edit:
                Toaster.show(rootView, R.string.Under_construction);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

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