package org.apache.fineract.ui.online.customers.customertasks;

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.BottomSheetDialog;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.fineract.R;
import org.apache.fineract.data.models.customer.Command;
import org.apache.fineract.data.models.customer.Customer;
import org.apache.fineract.ui.base.FineractBaseActivity;
import org.apache.fineract.ui.base.FineractBaseBottomSheetDialogFragment;
import org.apache.fineract.ui.base.Toaster;

import javax.inject.Inject;

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

/**
 * @author Rajan Maurya
 *         On 27/07/17.
 */
public class CustomerTasksBottomSheetFragment extends FineractBaseBottomSheetDialogFragment
        implements CustomerTasksBottomSheetContract.View {

    @BindView(R.id.iv_task1)
    ImageView ivTask1;

    @BindView(R.id.iv_task2)
    ImageView ivTask2;

    @BindView(R.id.tv_task1)
    TextView tvTask1;

    @BindView(R.id.tv_task2)
    TextView tvTask2;

    @BindView(R.id.ll_task2)
    LinearLayout llTask2;

    @BindView(R.id.ll_task_list)
    LinearLayout llTaskList;

    @BindView(R.id.ll_task_form)
    LinearLayout llTaskForm;

    @BindView(R.id.tv_header)
    TextView tvHeader;

    @BindView(R.id.tv_sub_header)
    TextView tvSubHeader;

    @BindView(R.id.et_comment)
    EditText etComment;

    @BindView(R.id.btn_submit_task)
    Button btnSubmitTask;

    @Inject
    CustomerTasksBottomSheetPresenter tasksBottomSheetPresenter;

    View rootView;

    private BottomSheetBehavior behavior;
    private Customer.State state;
    private Command command;
    private String customerIdentifier;
    private OnTasksChangeListener onTasksChangeListener;

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
        rootView = View.inflate(getContext(), R.layout.bottom_sheet_task_list, null);
        dialog.setContentView(rootView);
        behavior = BottomSheetBehavior.from((View) rootView.getParent());
        ((FineractBaseActivity) getActivity()).getActivityComponent().inject(this);
        tasksBottomSheetPresenter.attachView(this);
        ButterKnife.bind(this, rootView);
        command = new Command();

        switch (state) {
            case ACTIVE:
                ivTask1.setImageDrawable(
                        ContextCompat.getDrawable(getActivity(), R.drawable.ic_lock_black_24dp));
                tvTask1.setText(getString(R.string.lock));
                ivTask2.setImageDrawable(
                        ContextCompat.getDrawable(getActivity(), R.drawable.ic_close_black_24dp));
                tvTask2.setText(getString(R.string.close));
                break;
            case PENDING:
                llTask2.setVisibility(View.GONE);
                ivTask1.setImageDrawable(ContextCompat.getDrawable(getActivity(),
                        R.drawable.ic_check_circle_black_24dp));
                ivTask1.setColorFilter(ContextCompat.getColor(getActivity(), R.color.status));
                tvTask1.setText(getString(R.string.activate));
                break;
            case LOCKED:
                ivTask1.setImageDrawable(ContextCompat.getDrawable(getActivity(),
                        R.drawable.ic_lock_open_black_24dp));
                ivTask1.setColorFilter(ContextCompat.getColor(getActivity(), R.color.status));
                tvTask1.setText(getString(R.string.un_lock));
                ivTask2.setImageDrawable(
                        ContextCompat.getDrawable(getActivity(), R.drawable.ic_close_black_24dp));
                tvTask2.setText(getString(R.string.close));
                break;
            case CLOSED:
                llTask2.setVisibility(View.GONE);
                ivTask1.setImageDrawable(ContextCompat.getDrawable(getActivity(),
                        R.drawable.ic_check_circle_black_24dp));
                ivTask1.setColorFilter(ContextCompat.getColor(getActivity(), R.color.status));
                tvTask1.setText(getString(R.string.reopen));
                break;
        }

        return dialog;
    }

    @OnClick(R.id.iv_task1)
    void onClickTask1() {
        switch (state) {
            case ACTIVE:
                command.setAction(Command.Action.LOCK);
                tvHeader.setText(getString(R.string.lock));
                tvSubHeader.setText(
                        getString(R.string.please_verify_following_task, getString(R.string.lock)));
                btnSubmitTask.setText(getString(R.string.lock));
                state = Customer.State.LOCKED;
                break;
            case PENDING:
                command.setAction(Command.Action.ACTIVATE);
                tvHeader.setText(getString(R.string.activate));
                tvSubHeader.setText(getString(R.string.please_verify_following_task,
                        getString(R.string.activate)));
                btnSubmitTask.setText(getString(R.string.activate));
                state = Customer.State.ACTIVE;
                break;
            case LOCKED:
                command.setAction(Command.Action.UNLOCK);
                tvHeader.setText(getString(R.string.un_lock));
                tvSubHeader.setText(getString(R.string.please_verify_following_task,
                        getString(R.string.un_lock)));
                btnSubmitTask.setText(getString(R.string.un_lock));
                state = Customer.State.ACTIVE;
                break;
            case CLOSED:
                command.setAction(Command.Action.REOPEN);
                tvHeader.setText(getString(R.string.reopen));
                tvSubHeader.setText(getString(R.string.please_verify_following_task,
                        getString(R.string.reopen)));
                btnSubmitTask.setText(getString(R.string.reopen));
                state = Customer.State.ACTIVE;
                break;
        }
        llTaskList.setVisibility(View.GONE);
        llTaskForm.setVisibility(View.VISIBLE);
    }

    @OnClick(R.id.iv_task2)
    void onClickTask2() {
        command.setAction(Command.Action.CLOSE);
        tvHeader.setText(getString(R.string.close));
        tvSubHeader.setText(getString(R.string.please_verify_following_task,
                getString(R.string.close)));
        btnSubmitTask.setText(getString(R.string.close));
        state = Customer.State.CLOSED;
        llTaskList.setVisibility(View.GONE);
        llTaskForm.setVisibility(View.VISIBLE);
    }

    public void setCustomerStatus(Customer.State customerStatus) {
        state = customerStatus;
    }

    public void setCustomerIdentifier(String identifier) {
        customerIdentifier = identifier;
    }

    @OnClick(R.id.btn_submit_task)
    void submitTask() {
        command.setComment(etComment.getText().toString().trim());
        etComment.setEnabled(false);
        tasksBottomSheetPresenter.changeCustomerStatus(customerIdentifier, command);
    }

    @OnClick(R.id.btn_cancel)
    void onCancel() {
        dismiss();
    }

    public void setCustomerTasksChangeListener(OnTasksChangeListener onTasksChangeListener) {
        this.onTasksChangeListener = onTasksChangeListener;
    }

    @Override
    public void statusChangedSuccessfully() {
        Toast.makeText(getActivity(), R.string.task_updated_successfully, Toast.LENGTH_LONG).show();
        onTasksChangeListener.changeCustomerStatus(state);
        dismiss();
    }

    @Override
    public void showProgressbar() {
        showMifosProgressDialog(getString(R.string.updating_status));
    }

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

    @Override
    public void showError() {
        etComment.setEnabled(true);
        Toaster.show(rootView, getString(R.string.error_updating_status));
    }

    @Override
    public void onStart() {
        super.onStart();
        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
    }

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