package kz.arta.synergy.workflow.mobile.android.documents.favorite.activities;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import com.devspark.appmsg.AppMsg;
import com.pnikosis.materialishprogress.ProgressWheel;

import org.json.JSONObject;

import kz.arta.synergy.workflow.mobile.android.R;
import kz.arta.synergy.workflow.mobile.android.common.ActivityConst;
import kz.arta.synergy.workflow.mobile.android.common.components.SearchEditText;
import kz.arta.synergy.workflow.mobile.android.common.models.Person;
import kz.arta.synergy.workflow.mobile.android.common.requests.RestClient;
import kz.arta.synergy.workflow.mobile.android.common.requests.SendGetRequest;
import kz.arta.synergy.workflow.mobile.android.common.utils.ActionUtils;
import kz.arta.synergy.workflow.mobile.android.common.utils.FragmentConst;
import kz.arta.synergy.workflow.mobile.android.common.utils.MyApplication;
import kz.arta.synergy.workflow.mobile.android.common.utils.Wrapper;
import kz.arta.synergy.workflow.mobile.android.documents.DocumentConst;
import kz.arta.synergy.workflow.mobile.android.documents.common.activities.DocumentInfoActivity;
import kz.arta.synergy.workflow.mobile.android.documents.favorite.models.FavoriteItem;
import kz.arta.synergy.workflow.mobile.android.forms.general.activities.FormPlayer;
import kz.arta.synergy.workflow.mobile.android.forms.mobile.activities.FormPlayerNative;

/**
 * Created by neox on 22.06.15.
 * Экран со всеми избранными пунктами
 */
public class FavoritesActivity extends Activity {

    /**
     * Активити
     */
    private Activity activity;

    /**
     * Прогрессбар
     */
    private ProgressWheel progressBar;

    /**
     * Авторизированный пользователь
     */
    private Person person;

    /**
     * Класс для работы со списком
     */
    private Favorite favorite;

    /**
     * Контейнер, в котором находятся пункты
     */
    private LinearLayout favoritesList;

    /**
     * Идентификатор созданного документа
     */
    private String documentID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        setContentView(R.layout.favorites_activity);
        super.onCreate(savedInstanceState);

        activity = this;

        ActionBar actionBar = getActionBar();
        if (actionBar != null) {
            actionBar.hide();
        }

        Intent intent = getIntent();
        person = (Person) intent.getSerializableExtra(ActivityConst.PERSON);

        progressBar = (ProgressWheel) findViewById(R.id.favorites_progress_bar);

        getFavoriteItems();

    }

    /**
     * Метод загружает избранные пункты
     */
    private void getFavoriteItems() {
        new SendGetRequest("rest/api/registry/favorite?locale=" + MyApplication.getLang(), person) {
            @Override
            protected void onPostExecute(String result) {
                if (result == null) {
                    AppMsg.makeText(activity, getString(R.string.favorites_not_found), AppMsg.STYLE_ALERT).show();
                    return;
                }
                try {
                    FavoriteItem[] favoriteItems = RestClient.getGson().fromJson(result, FavoriteItem[].class);
                    favoritesList = (LinearLayout) findViewById(R.id.favorites_list);
                    favorite = new Favorite(person, activity);
                    favorite.setFavoriteItems(favoriteItems);
                    favorite.setAll(true);
                    favorite.initFavoriteDocuments(favoritesList);
                    initComponents();
                } catch (Exception exc) {
                    AppMsg.makeText(activity, getString(R.string.favorites_not_found), AppMsg.STYLE_ALERT).show();
                }
                progressBar.setVisibility(View.GONE);
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Инициализация компонентов
     */
    private void initComponents() {
        final SearchEditText editText = (SearchEditText) findViewById(R.id.favorites_activity_search_users);
        editText.setListener(new SearchEditText.SearchTextListener() {
            @Override
            public void onTextChanged(String text) {
                favorite.search(text, favoritesList);
            }
        });
        Button save = (Button) findViewById(R.id.favorites_activity_select_button);
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Favorite.Item item = favorite.getSelectedItem();
                if (item != null) {
                    createDocument(item.favoriteItem);
                } else {
                    AppMsg.makeText(activity, getString(R.string.favorite_item_not_selected), AppMsg.STYLE_ALERT).show();
                }
            }
        });
    }

    /**
     * Метод использутся для создания документа
     *
     * @param item описание текущего элемента
     */
    public void createDocument(final FavoriteItem item) {
        // сначала создаем документ
        new SendGetRequest("rest/api/registry/create_doc?registryID=" + item.getRegistryID(), person) {
            @Override
            protected void onPostExecute(String result) {
                try {
                    JSONObject jsonObject = new JSONObject(result);
                    String errorCode = jsonObject.getString("errorCode");
                    if (errorCode.equals(Wrapper.NO_ERROR)) {
                        documentID = jsonObject.getString("documentID");
                        final String dataUUID = jsonObject.getString("dataUUID");
                        // затем смотрим есть ли у формы для данного документа мобильное представление
                        new SendGetRequest("rest/api/asforms/form/" + item.getFormID() + "?isMobile=true", person) {
                            @Override
                            protected void onPostExecute(String result) {
                                try {
                                    Intent intent = new Intent(activity, (result.equals("{}") ? FormPlayer.class : FormPlayerNative.class));
                                    intent.putExtra(ActivityConst.DATA_UUID, dataUUID);
                                    intent.putExtra(ActivityConst.PERSON, person);
                                    intent.putExtra(ActivityConst.EDIT, true);
                                    intent.putExtra(ActivityConst.CAN_EDIT, "true");
                                    startActivityForResult(intent, ActionUtils.SAVE_FORM);
                                } catch (Exception exc) {
                                    AppMsg.makeText(activity, getString(R.string.error_to_create_document), AppMsg.STYLE_ALERT).show();
                                }
                                super.onPostExecute(result);
                            }
                        }.execute();
                    } else {
                        String errorMessage = jsonObject.getString("errorMessage");
                        AppMsg.makeText(activity, errorMessage, AppMsg.STYLE_ALERT).show();
                    }
                } catch (Exception exc) {
                    AppMsg.makeText(activity, getString(R.string.error_to_create_document), AppMsg.STYLE_ALERT).show();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_CANCELED) {
            return;
        }
        if (requestCode == ActionUtils.SAVE_FORM) {
            openDocumentInfo();
        }
    }

    /**
     * Метод открывает экран с информацией о работе
     */
    private void openDocumentInfo() {
        if (documentID == null) {
            return;
        }
        // после успешного сохранения данных по форме - открывается экран с информацией о документе
        Intent intent = new Intent(activity, DocumentInfoActivity.class);
        intent.putExtra(ActivityConst.DOCUMENT_ID, documentID);
        intent.putExtra(ActivityConst.PERSON, person);
        intent.putExtra(DocumentConst.TYPE_ITEM_DOCUMENTS, DocumentConst.ALL);
        startActivityForResult(intent, FragmentConst.UPDATE_WORK_LIST);
        finish();
    }
}
