package kz.arta.synergy.workflow.mobile.android.users.activities;

import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

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

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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.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.Fonts;
import kz.arta.synergy.workflow.mobile.android.common.utils.Logger;
import kz.arta.synergy.workflow.mobile.android.common.utils.MyApplication;
import kz.arta.synergy.workflow.mobile.android.common.utils.UserSerializable;
import kz.arta.synergy.workflow.mobile.android.common.utils.Utils;
import kz.arta.synergy.workflow.mobile.android.users.adapters.AdapterSelectedUsers;
import kz.arta.synergy.workflow.mobile.android.users.adapters.AdapterUsersMulti;
import kz.arta.synergy.workflow.mobile.android.users.models.UserItem;

/**
 * Created by neox on 17.04.14.
 * Юзерчузер с мультивыбором (в идеале надо объединить в один)
 */
public class UserChooserMultiActivity extends Activity {

    /**
     * Данные авторизированного пользователя
     */
    private Person person;

    /**
     * Показывать всех пользователей либо - только тех кому можно ставить работу
     */
    private String showAll;

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

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

    /**
     * Массив пользователей
     */
    private List<UserItem> usersArray;

    /**
     * Адаптер для списка
     */
    private AdapterUsersMulti usersAdapter;

    /**
     * Изображение лупы (нужно для поля для поиска пользователей)
     */
    private ImageView loupeIcon;

    /**
     * Крестик (нужно для поля для поиска пользователей)
     */
    private ImageView clearIcon;

    /**
     * Выбранные пользователи
     */
    private String[] selectedUsersID;

    /**
     * UUID ответственного (используется только в случае если в конфигураторе включена галочка "Ставить работы исполнителям от имени ответственного"
     */
    private String resUserID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

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

        activity = this;

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

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

        Intent intent = getIntent();
        showAll = intent.getStringExtra(ActivityConst.SHOW_ALL);
        person = (Person) intent.getSerializableExtra(ActivityConst.PERSON);
        selectedUsersID = intent.getStringArrayExtra(ActivityConst.SELECTED);
        resUserID = intent.getStringExtra(ActivityConst.USER_ID);

        final List<String> selectedUsersData = new ArrayList<>();
        final AdapterSelectedUsers adapterSelectedUsers = new AdapterSelectedUsers(activity, selectedUsersData);
        final GridView gridView = (GridView) findViewById(R.id.selected_users_gridview);
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                showRemoveUserDialog(selectedUsersData.get(position));
            }
        });
        gridView.setAdapter(adapterSelectedUsers);
        gridView.setNumColumns(GridView.AUTO_FIT);
        gridView.setColumnWidth(Utils.convertDpToPixel(150, activity));
        gridView.setVerticalSpacing(Utils.convertDpToPixel(5, activity));
        gridView.setHorizontalSpacing(Utils.convertDpToPixel(5, activity));

        final TextView showMoreUsers = (TextView) findViewById(R.id.show_more_users);
        showMoreUsers.setTypeface(Fonts.getMedium(activity));

        ListView usersList = (ListView) findViewById(R.id.users_list_multi);
        usersArray = new ArrayList<>();
        usersAdapter = new AdapterUsersMulti(activity, usersArray, selectedUsersData, adapterSelectedUsers, gridView, showMoreUsers);
        usersList.setAdapter(usersAdapter);
        usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                usersArray.get(i).setChecked(!usersArray.get(i).isChecked());
                usersAdapter.notifyDataSetChanged();
                usersAdapter.update(i);
            }
        });

        final EditText searchUser = (EditText) findViewById(R.id.search_user_button_user_chooser_multi);
        searchUser.setSingleLine(true);
        searchUser.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
                if (charSequence.length() > 0) {
                    loupeIcon.setVisibility(View.GONE);
                    clearIcon.setVisibility(View.VISIBLE);
                } else {
                    loupeIcon.setVisibility(View.VISIBLE);
                    clearIcon.setVisibility(View.GONE);
                }
                getUsers(charSequence.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            }

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

        showMoreUsers.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (showMoreUsers.getText().toString().startsWith(activity.getString(R.string.and_again))) {
                    Utils.gridViewHeightWrap(gridView);
                    showMoreUsers.setText(getString(R.string.hide));
                } else {
                    Utils.gridViewHeight(gridView, activity);
                    showMoreUsers.setText(activity.getString(R.string.and_again) + " " +
                            String.valueOf(selectedUsersData.size() - gridView.getNumColumns()) + " " + activity.getString(R.string.others_users));
                }
            }
        });

        Button saveButton = (Button) findViewById(R.id.user_chooser_activity_save_multi);
        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                UserSerializable userSerializable = new UserSerializable();
                for (int i = 0; i < usersAdapter.getUuid().size(); i++) {
                    userSerializable.getUsersID().add(usersAdapter.getUuid().get(i));
                    userSerializable.getNames().add(usersAdapter.getNames().get(i));
                }
                Intent intent = new Intent();
                intent.putExtra(ActivityConst.USERS_ID, userSerializable);
                setResult(RESULT_OK, intent);
                finish();
            }
        });

        loupeIcon = (ImageView) findViewById(R.id.user_chooser_multi_lupa);
        clearIcon = (ImageView) findViewById(R.id.user_chooser_multi_krest);
        clearIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                searchUser.setText("");
            }
        });

        getUsers("");
    }

    /**
     * Метод выполняет поиск пользователей и обновляет информацию в списке (также выполняется при открытии активити)
     *
     * @param searchText - имя пользователя
     */
    private void getUsers(String searchText) {

        progressBar.setVisibility(View.VISIBLE);

        String textSearch = null;
        try {
            textSearch = URLEncoder.encode(String.valueOf(searchText), "utf-8");
        } catch (UnsupportedEncodingException e) {
            Logger.v(e.getLocalizedMessage());
        }

        String url;

        if (resUserID != null) {
            url = "rest/api/userchooser/search?showAll=false&search=" + textSearch +
                    "&recordsCount=999999&userID=" + resUserID + "&locale=" + MyApplication.getLang();
        } else if (showAll.equals("false")) {
            url = "rest/api/userchooser/search?showAll=false&operationType=101&search=" + textSearch +
                    "&recordsCount=999999&locale=" + MyApplication.getLang();
        } else {
            url = "rest/api/userchooser/search?showAll=true&operationType=101&search=" + textSearch +
                    "&recordsCount=999999&locale=" + MyApplication.getLang();
        }

        new SendGetRequest(url, person) {
            @Override
            protected void onPostExecute(String result) {
                usersAdapter.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);
                if (result == null) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                    return;
                }
                try {
                    UserItem[] user = RestClient.getGson().fromJson(result, UserItem[].class);
                    if (user.length != 0) {
                        usersArray.clear();
                        Collections.addAll(usersArray, user);
                    }
                    for (int i = 0; i < usersArray.size(); i++) {
                        for (int j = 0; j < usersAdapter.getUuid().size(); j++) {
                            if (usersArray.get(i).getUserID().equals(usersAdapter.getUuid().get(j))) {
                                usersAdapter.getUsers().get(i).setChecked(true);
                            }
                        }
                    }
                    // если пользователь уже выбирал пользователей - выставляем их
                    if (selectedUsersID != null) {
                        for (String aSelectedUsersID : selectedUsersID) {
                            for (int i = 0; i < usersArray.size(); i++) {
                                if (usersArray.get(i).getUserID().equals(aSelectedUsersID)) {
                                    usersArray.get(i).setChecked(true);
                                    usersAdapter.update(i);
                                }
                            }
                        }
                    }
                } catch (Exception exc) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Метод вызывается при нажатии на плашку выбранных пользователей
     *
     * @param userName имя удаляемого пользователя
     */
    private void showRemoveUserDialog(final String userName) {
        AlertDialog.Builder ad = new AlertDialog.Builder(activity);
        ad.setTitle(getString(R.string.remove_user));  // заголовок
        ad.setMessage("Вы действительно хотите удалить \"" + userName + "\" из списка выбранных пользователей?"); // сообщение
        ad.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int arg1) {
                // говнокод к нам приходит, говнокод к нам приходит
                // веселье приносит и вкус бодрящий..
                for (int i = 0; i < usersArray.size(); i++) {
                    if (usersArray.get(i).getName().equals(userName)) {
                        usersArray.get(i).setChecked(false);
                        usersAdapter.notifyDataSetChanged();
                        usersAdapter.update(i);
                        return;
                    }
                }
            }
        });
        ad.setNegativeButton(getString(R.string.no), null);
        ad.setCancelable(true);
        ad.show();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }
}

