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.ImageView;
import android.widget.ListView;

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.users.adapters.AdapterUsers;
import kz.arta.synergy.workflow.mobile.android.users.models.UserItem;

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

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

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

    /**
     * Адаптер для списка пользователей
     */
    private AdapterUsers usersAdapter;

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

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

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

    /**
     * Если у пользователя есть делегированые права на создание работы от имени другого пользователя - author != null
     */
    private boolean author;

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

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

    /**
     * id выбранного пользователя
     */
    private String userID;

    /**
     * Имя выбранного пользователя
     */
    private String userName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

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

        activity = this;

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

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

        Intent intent = getIntent();
        showAll = intent.getStringExtra(ActivityConst.SHOW_ALL);
        person = (Person) intent.getSerializableExtra(ActivityConst.PERSON);
        author = intent.getBooleanExtra(ActivityConst.AUTHOR, false);
        userID = intent.getStringExtra(ActivityConst.USER_ID);
        userName = intent.getStringExtra(ActivityConst.USER_NAME);

        final EditText searchUser = (EditText) findViewById(R.id.search_user_button_user_chooser);
        searchUser.setSingleLine(true);
        searchUser.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            }

            @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 afterTextChanged(Editable editable) {
            }
        });

        final Button selectedUserButton = (Button) findViewById(R.id.selected_user_button);
        selectedUserButton.setTypeface(Fonts.getMedium(activity));
        selectedUserButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showRemoveUserDialog(selectedUserButton);
            }
        });

        if (userID != null) {
            selectedUserButton.setText(userName);
            selectedUserButton.setVisibility(View.VISIBLE);
        }

        final Button saveButton = (Button) findViewById(R.id.user_chooser_activity_save);
        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra(ActivityConst.USER_ID, userID);
                intent.putExtra(ActivityConst.USER_NAME, userName);
                setResult(RESULT_OK, intent);
                finish();
            }
        });

        usersArray = new ArrayList<>();
        usersAdapter = new AdapterUsers(this, usersArray);

        ListView users = (ListView) findViewById(R.id.users_list);
        users.setAdapter(usersAdapter);
        users.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (userID != null && userID.equals(usersArray.get(i).getUserID())) {
                    for (UserItem user : usersArray) {
                        user.setChecked(false);
                    }
                    usersAdapter.notifyDataSetChanged();
                    selectedUserButton.setText("");
                    selectedUserButton.setVisibility(View.GONE);
                    userID = null;
                    userName = null;
                } else {
                    for (UserItem user : usersArray) {
                        user.setChecked(false);
                    }
                    usersArray.get(i).setChecked(true);
                    usersAdapter.notifyDataSetChanged();
                    selectedUserButton.setVisibility(View.VISIBLE);
                    selectedUserButton.setText(usersArray.get(i).getName());
                    userID = usersArray.get(i).getUserID();
                    userName = usersArray.get(i).getName();
                }
            }
        });

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

        getUsers("");
    }

    private void showRemoveUserDialog(final Button button) {
        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 (UserItem user : usersArray) {
                    user.setChecked(false);
                }
                usersAdapter.notifyDataSetChanged();
                button.setText("");
                button.setVisibility(View.GONE);
                userID = null;
                userName = null;
            }
        });
        ad.setNegativeButton(getString(R.string.no), null);
        ad.setCancelable(true);
        ad.show();
    }

    /**
     * Метод выполняет поиск пользователей и обновляет информацию в списке (также выполняется при открытии активити)
     *
     * @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 (author) {
            url = "rest/api/userchooser/search?showAll=true&ownerOperationType=101&search=" + textSearch +
                    "&recordsCount=999999&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[] userItem = RestClient.getGson().fromJson(result, UserItem[].class);
                    if (userItem.length != 0) {
                        usersArray.clear();
                        Collections.addAll(usersArray, userItem);
                        usersAdapter.notifyDataSetChanged();
                        if (userID != null) {
                            for (int i = 0; i < usersArray.size(); i++) {
                                if (usersArray.get(i).getUserID().equals(userID)) {
                                    usersArray.get(i).setChecked(true);
                                    break;
                                }
                            }
                        }
                    }
                } catch (Exception exc) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

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