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

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.textfield.TextInputLayout;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

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

import org.apache.fineract.R;
import org.apache.fineract.data.models.customer.ContactDetail;
import org.apache.fineract.data.models.customer.Customer;
import org.apache.fineract.ui.base.FineractBaseFragment;
import org.apache.fineract.utils.ConstantKeys;

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

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * @author Rajan Maurya
 *         On 25/07/17.
 */
public class FormCustomerContactFragment extends FineractBaseFragment implements Step, TextWatcher {

    @BindView(R.id.til_email)
    TextInputLayout tilEmail;

    @BindView(R.id.et_email)
    EditText etEmail;

    @BindView(R.id.et_phone_number)
    EditText etPhone;

    @BindView(R.id.et_mobile)
    EditText etMobile;

    View rootView;

    private Customer customer;
    private CustomerAction customerAction;

    private OnNavigationBarListener.CustomerContactDetails onNavigationBarListener;

    public static FormCustomerContactFragment newInstance(Customer customer,
            CustomerAction action) {
        FormCustomerContactFragment fragment = new FormCustomerContactFragment();
        Bundle args = new Bundle();
        args.putParcelable(ConstantKeys.CUSTOMER, customer);
        args.putSerializable(ConstantKeys.CUSTOMER_ACTION, action);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            customer = getArguments().getParcelable(ConstantKeys.CUSTOMER);
            customerAction = (CustomerAction) getArguments().getSerializable(
                    ConstantKeys.CUSTOMER_ACTION);
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_form_customer_contact, container, false);
        ButterKnife.bind(this, rootView);
        etEmail.addTextChangedListener(this);

        if (customerAction == CustomerAction.EDIT) {
            showPreviousContactDetails();
        }

        return rootView;
    }

    public void showPreviousContactDetails() {
        if (customer.getContactDetails().size() != 0) {
            for (ContactDetail contactDetail : customer.getContactDetails()) {
                showContactDetails(contactDetail);
            }
        }
    }

    public void showContactDetails(ContactDetail contactDetail) {
        switch (contactDetail.getType()) {
            case EMAIL:
                etEmail.setText(contactDetail.getValue());
                break;
            case MOBILE:
                etMobile.setText(contactDetail.getValue());
                break;
            case PHONE:
                etPhone.setText(contactDetail.getValue());
                break;
        }
    }

    @Override
    public VerificationError verifyStep() {
        if (!validateEmail()) {
            return new VerificationError(null);
        } else {

            List<ContactDetail> contactDetails = new ArrayList<>();

            if (!TextUtils.isEmpty(etEmail.getText().toString().trim())) {
                ContactDetail emailContactDetail = new ContactDetail();
                emailContactDetail.setGroup(ContactDetail.Group.BUSINESS);
                emailContactDetail.setType(ContactDetail.Type.EMAIL);
                emailContactDetail.setPreferenceLevel(1);
                emailContactDetail.setValue(etEmail.getText().toString().trim());
                contactDetails.add(emailContactDetail);
            }

            if (!TextUtils.isEmpty(etPhone.getText().toString().trim())) {
                ContactDetail phoneContactDetail = new ContactDetail();
                phoneContactDetail.setGroup(ContactDetail.Group.BUSINESS);
                phoneContactDetail.setType(ContactDetail.Type.PHONE);
                phoneContactDetail.setPreferenceLevel(1);
                phoneContactDetail.setValue(etPhone.getText().toString().trim());
                contactDetails.add(phoneContactDetail);
            }

            if (!TextUtils.isEmpty(etMobile.getText().toString().trim())) {
                ContactDetail mobileContactDetail = new ContactDetail();
                mobileContactDetail.setGroup(ContactDetail.Group.BUSINESS);
                mobileContactDetail.setType(ContactDetail.Type.MOBILE);
                mobileContactDetail.setPreferenceLevel(1);
                mobileContactDetail.setValue(etMobile.getText().toString().trim());
                contactDetails.add(mobileContactDetail);
            }

            onNavigationBarListener.setContactDetails(contactDetails);
        }
        return null;
    }

    @Override
    public void afterTextChanged(Editable s) {
        if ((etEmail.getText().hashCode() == s.hashCode())) {
            validateEmail();
        }
    }

    public boolean validateEmail() {
        String email = etEmail.getText().toString().trim();
        if (!TextUtils.isEmpty(email) && !isValidEmail(email)) {
            tilEmail.setErrorEnabled(true);
            tilEmail.setError(getString(R.string.invalid_email));
            return false;
        } else if (TextUtils.isEmpty(email)) {
            tilEmail.setErrorEnabled(true);
            tilEmail.setError(null);
            return true;
        }
        tilEmail.setErrorEnabled(true);
        tilEmail.setError(null);
        return true;
    }

    private static boolean isValidEmail(String email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }

    @Override
    public void onSelected() {
    }

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

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

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