package org.wordpress.android.ui.accounts;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.models.AccountHelper;
import org.wordpress.android.ui.accounts.helpers.CreateUserAndBlog;
import org.wordpress.android.ui.plans.PlansConstants;
import org.wordpress.android.util.AlertUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.EditTextUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.widgets.WPTextView;

public class NewBlogFragment extends AbstractFragment implements TextWatcher {
    private EditText mSiteUrlTextField;
    private EditText mSiteTitleTextField;
    private WPTextView mSignupButton;
    private WPTextView mProgressTextSignIn;
    private WPTextView mCancelButton;
    private RelativeLayout mProgressBarSignIn;
    private boolean mSignoutOnCancelMode;
    private boolean mAutoCompleteUrl;

    public NewBlogFragment() {
    }

    @Override
    public void afterTextChanged(Editable s) {
    }

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

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

    public void setSignoutOnCancelMode(boolean mode) {
        mSignoutOnCancelMode = mode;
        mCancelButton.setVisibility(View.VISIBLE);
    }

    public boolean isSignoutOnCancelMode() {
        return mSignoutOnCancelMode;
    }

    public void onBackPressed() {
        signoutAndFinish();
    }

    protected void onDoneAction() {
        validateAndCreateUserAndBlog();
    }

    private void signoutAndFinish() {
        if (mSignoutOnCancelMode) {
            WordPress.WordPressComSignOut(getActivity());
            getActivity().setResult(Activity.RESULT_CANCELED);
            getActivity().finish();
        }
    }

    private boolean fieldsFilled() {
        return EditTextUtils.getText(mSiteUrlTextField).trim().length() > 0
                && EditTextUtils.getText(mSiteTitleTextField).trim().length() > 0;
    }

    protected void startProgress(String message) {
        mProgressBarSignIn.setVisibility(View.VISIBLE);
        mProgressTextSignIn.setVisibility(View.VISIBLE);
        mSignupButton.setVisibility(View.GONE);
        mProgressBarSignIn.setEnabled(false);
        mProgressTextSignIn.setText(message);
        mSiteTitleTextField.setEnabled(false);
        mSiteUrlTextField.setEnabled(false);
    }

    protected void updateProgress(String message) {
        mProgressTextSignIn.setText(message);
    }

    protected void endProgress() {
        mProgressBarSignIn.setVisibility(View.GONE);
        mProgressTextSignIn.setVisibility(View.GONE);
        mSignupButton.setVisibility(View.VISIBLE);
        mSiteTitleTextField.setEnabled(true);
        mSiteUrlTextField.setEnabled(true);
    }

    private void showSiteUrlError(int messageId) {
        mSiteUrlTextField.setError(getString(messageId));
        mSiteUrlTextField.requestFocus();
    }

    private void showSiteTitleError(int messageId) {
        mSiteTitleTextField.setError(getString(messageId));
        mSiteTitleTextField.requestFocus();
    }

    protected boolean specificShowError(int messageId) {
        switch (getErrorType(messageId)) {
            case TITLE:
                showSiteTitleError(messageId);
                return true;
            case SITE_URL:
                showSiteUrlError(messageId);
                return true;
        }
        return false;
    }

    protected boolean isUserDataValid() {
        final String siteTitle = EditTextUtils.getText(mSiteTitleTextField).trim();
        final String siteUrl = EditTextUtils.getText(mSiteUrlTextField).trim();
        boolean retValue = true;

        if (siteTitle.equals("")) {
            mSiteTitleTextField.setError(getString(R.string.required_field));
            mSiteTitleTextField.requestFocus();
            retValue = false;
        }

        if (siteUrl.equals("")) {
            mSiteUrlTextField.setError(getString(R.string.required_field));
            mSiteUrlTextField.requestFocus();
            retValue = false;
        }
        return retValue;
    }

    private String titleToUrl(String siteUrl) {
        return siteUrl.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
    }

    private void validateAndCreateUserAndBlog() {
        if (mSystemService.getActiveNetworkInfo() == null) {
            AlertUtils.showAlert(getActivity(), R.string.no_network_title, R.string.no_network_message);
            return;
        }
        if (!isUserDataValid()) {
            return;
        }

        // prevent double tapping of the "done" btn in keyboard for those clients that don't dismiss the keyboard.
        // Samsung S4 for example
        if (View.VISIBLE == mProgressBarSignIn.getVisibility()) {
            return;
        }

        startProgress(getString(R.string.validating_site_data));

        final String siteUrl = EditTextUtils.getText(mSiteUrlTextField).trim();
        final String siteName = EditTextUtils.getText(mSiteTitleTextField).trim();
        final String language = CreateUserAndBlog.getDeviceLanguage(getActivity());

        CreateUserAndBlog createUserAndBlog = new CreateUserAndBlog("", "", "", siteUrl, siteName, language,
                getRestClientUtils(), new ErrorListener(), new CreateUserAndBlog.Callback() {
            @Override
            public void onStepFinished(CreateUserAndBlog.Step step) {
                if (getActivity() != null) {
                    updateProgress(getString(R.string.create_new_blog_wpcom));
                }
            }

            @Override
            public void onSuccess(JSONObject createSiteResponse) {
                if (getActivity() == null) {
                    return;
                }
                endProgress();
                try {
                    JSONObject details = createSiteResponse.getJSONObject("blog_details");
                    String blogName = details.getString("blogname");
                    String xmlRpcUrl = details.getString("xmlrpc");
                    String homeUrl = details.getString("url");
                    String blogId = details.getString("blogid");
                    String username = AccountHelper.getDefaultAccount().getUserName();
                    BlogUtils.addOrUpdateBlog(blogName, xmlRpcUrl, homeUrl, blogId, username, null, null, null,
                            true, true, PlansConstants.DEFAULT_PLAN_ID_FOR_NEW_BLOG, null, null);
                    AnalyticsTracker.track(AnalyticsTracker.Stat.CREATED_SITE);
                    ToastUtils.showToast(getActivity(), R.string.new_blog_wpcom_created);
                } catch (JSONException e) {
                    AppLog.e(T.NUX, "Invalid JSON response from site/new", e);
                }
                getActivity().setResult(Activity.RESULT_OK);
                getActivity().finish();
            }

            @Override
            public void onError(int messageId) {
                if (getActivity() == null) {
                    return;
                }
                endProgress();
                showError(getString(messageId));
            }
        });
        AppLog.i(T.NUX, "User tries to create a new site, name: " + siteName + ", URL: " + siteUrl);
        createUserAndBlog.startCreateBlogProcess();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout containing a title and body text.
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.create_blog_fragment, container, false);

        mSignupButton = (WPTextView) rootView.findViewById(R.id.signup_button);
        mSignupButton.setOnClickListener(mSignupClickListener);
        mSignupButton.setEnabled(false);

        mCancelButton = (WPTextView) rootView.findViewById(R.id.cancel_button);
        mCancelButton.setOnClickListener(mCancelClickListener);

        mProgressTextSignIn = (WPTextView) rootView.findViewById(R.id.nux_sign_in_progress_text);
        mProgressBarSignIn = (RelativeLayout) rootView.findViewById(R.id.nux_sign_in_progress_bar);

        mSiteUrlTextField = (EditText) rootView.findViewById(R.id.site_url);
        mSiteUrlTextField.setOnKeyListener(mSiteUrlKeyListener);
        mSiteUrlTextField.setOnEditorActionListener(mEditorAction);
        mSiteUrlTextField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

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

            @Override
            public void afterTextChanged(Editable s) {
                BlogUtils.convertToLowercase(s);
            }
        });

        mSiteTitleTextField = (EditText) rootView.findViewById(R.id.site_title);
        mSiteTitleTextField.addTextChangedListener(this);
        mSiteTitleTextField.addTextChangedListener(mSiteTitleWatcher);
        mSiteTitleTextField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    mAutoCompleteUrl = EditTextUtils.getText(mSiteTitleTextField)
                            .equals(EditTextUtils.getText(mSiteUrlTextField))
                            || EditTextUtils.isEmpty(mSiteUrlTextField);
                }
            }
        });
        return rootView;
    }

    private void checkIfFieldsFilled() {
        if (fieldsFilled()) {
            mSignupButton.setEnabled(true);
        } else {
            mSignupButton.setEnabled(false);
        }
    }

    private final OnClickListener mSignupClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            validateAndCreateUserAndBlog();
        }
    };

    private final OnClickListener mCancelClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            signoutAndFinish();
        }
    };

    private final TextWatcher mSiteTitleWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // auto fill blog address from title if user hasn't modified url
            if (mAutoCompleteUrl) {
                mSiteUrlTextField.setText(titleToUrl(EditTextUtils.getText(mSiteTitleTextField)));
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    };

    private final OnKeyListener mSiteUrlKeyListener = new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            mAutoCompleteUrl = EditTextUtils.isEmpty(mSiteUrlTextField);
            return false;
        }
    };

    private final TextView.OnEditorActionListener mEditorAction = new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            return onDoneEvent(actionId, event);
        }
    };
}
