package org.apache.fineract.ui.online.identification.createidentification;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.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.DatePicker;
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.identification.ExpirationDate;
import org.apache.fineract.data.models.customer.identification.Identification;
import org.apache.fineract.ui.base.FineractBaseFragment;
import org.apache.fineract.utils.ConstantKeys;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

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

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

    public static final String DATE_FORMAT = "dd MMM yyyy";

    @BindView(R.id.til_number)
    TextInputLayout tilNumber;

    @BindView(R.id.et_number)
    EditText etNumber;

    @BindView(R.id.til_type)
    TextInputLayout tilType;

    @BindView(R.id.et_type)
    EditText etType;

    @BindView(R.id.til_expiration_date)
    TextInputLayout tilExpirationDate;

    @BindView(R.id.et_expiration_date)
    EditText etExpirationDate;

    @BindView(R.id.til_issuer)
    TextInputLayout tilIssuer;

    @BindView(R.id.et_issuer)
    EditText etIssuer;

    View rootView;

    private Calendar calendar = Calendar.getInstance();
    private ExpirationDate expirationDate;
    private Action action;
    private Identification identification;

    private DatePickerDialog.OnDateSetListener date;
    private OnNavigationBarListener.IdentificationCard onNavigationBarListener;

    public static FormIdentificationDetailsFragment newInstance(Action action,
            Identification identification) {
        FormIdentificationDetailsFragment fragment = new FormIdentificationDetailsFragment();
        Bundle args = new Bundle();
        args.putSerializable(ConstantKeys.IDENTIFICATION_ACTION, action);
        args.putParcelable(ConstantKeys.IDENTIFICATION_CARD, identification);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        expirationDate = new ExpirationDate();
        action = (Action) getArguments().getSerializable(ConstantKeys.IDENTIFICATION_ACTION);
        identification = getArguments().getParcelable(ConstantKeys.IDENTIFICATION_CARD);
    }

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

        showUserInterface();

        if (action == Action.EDIT) {
            editIdentificationCardDetails(identification);
        }

        return rootView;
    }

    public void showUserInterface() {
        etNumber.addTextChangedListener(this);
        etExpirationDate.addTextChangedListener(this);
        etIssuer.addTextChangedListener(this);
        etExpirationDate.setText(DATE_FORMAT);
        date = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                calendar.set(Calendar.YEAR, year);
                calendar.set(Calendar.MONTH, monthOfYear);
                calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                expirationDate.setDay(dayOfMonth);
                expirationDate.setMonth(monthOfYear + 1);
                expirationDate.setYear(year);
                setDateOfBirth();
            }
        };
    }

    public void editIdentificationCardDetails(Identification identification) {
        etNumber.setText(identification.getNumber());
        etIssuer.setText(identification.getIssuer());
        etType.setText(identification.getType());
        expirationDate = identification.getExpirationDate();
        calendar.set(Calendar.YEAR, identification.getExpirationDate().getYear());
        calendar.set(Calendar.MONTH, identification.getExpirationDate().getMonth());
        calendar.set(Calendar.DAY_OF_MONTH, identification.getExpirationDate().getDay());
        setDateOfBirth();
        etNumber.setEnabled(false);
    }

    @OnClick(R.id.et_expiration_date)
    void onClickDateOfBirth() {
        new DatePickerDialog(getActivity(), date, calendar
                .get(Calendar.YEAR), calendar.get(Calendar.MONTH),
                calendar.get(Calendar.DAY_OF_MONTH)).show();
    }

    private void setDateOfBirth() {
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH);
        etExpirationDate.setText(sdf.format(calendar.getTime()));
        validateExpirationDate();
    }

    @Override
    public VerificationError verifyStep() {
        if (!validateNumber() || !validateType() || !validateExpirationDate()
                || !validateIssuer()) {
            return new VerificationError(null);
        } else {
            Identification identification = new Identification();
            identification.setNumber(etNumber.getText().toString().trim());
            identification.setType(etType.getText().toString().trim());
            identification.setExpirationDate(expirationDate);
            identification.setIssuer(etIssuer.getText().toString().trim());
            onNavigationBarListener.setIdentificationDetails(identification);
        }
        return null;
    }

    @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 afterTextChanged(Editable s) {
        if ((etNumber.getText().hashCode() == s.hashCode())) {
            validateNumber();
        } else if (etType.getText().hashCode() == s.hashCode()) {
            validateType();
        } else if (etExpirationDate.getText().hashCode() == s.hashCode()) {
            validateExpirationDate();
        } else if (etIssuer.getText().hashCode() == s.hashCode()) {
            validateIssuer();
        }
    }

    public boolean validateNumber() {
        String number = etNumber.getText().toString().trim();
        if (TextUtils.isEmpty(number)) {
            showTextInputLayoutError(tilNumber, getString(R.string.unique_required));
            return false;
        }
        showTextInputLayoutError(tilNumber, null);
        return true;
    }

    public boolean validateType() {
        String type = etType.getText().toString().trim();
        if (TextUtils.isEmpty(type)) {
            showTextInputLayoutError(tilType, getString(R.string.required));
            return false;
        }
        showTextInputLayoutError(tilType, null);
        return true;
    }

    public boolean validateIssuer() {
        String issuer = etIssuer.getText().toString().trim();
        if (TextUtils.isEmpty(issuer)) {
            showTextInputLayoutError(tilIssuer, getString(R.string.required));
            return false;
        }
        showTextInputLayoutError(tilIssuer, null);
        return true;
    }

    public boolean validateExpirationDate() {
        if ((expirationDate.getDay() == null) || (expirationDate.getYear() == null) || (
                expirationDate.getMonth() == null)) {
            showTextInputLayoutError(tilExpirationDate, getString(R.string.required));
            return false;
        }
        showTextInputLayoutError(tilExpirationDate, null);
        return true;
    }

    public void showTextInputLayoutError(TextInputLayout textInputLayout, String errorMessage) {
        textInputLayout.setErrorEnabled(true);
        textInputLayout.setError(errorMessage);
    }

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