package kz.arta.synergy.workflow.mobile.android.forms.general.components.projectchooser;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.devspark.appmsg.AppMsg;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.pnikosis.materialishprogress.ProgressWheel;

import java.util.ArrayList;
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.Const;
import kz.arta.synergy.workflow.mobile.android.common.utils.Fonts;
import kz.arta.synergy.workflow.mobile.android.common.utils.HorizontalListView;
import kz.arta.synergy.workflow.mobile.android.common.utils.Utils;
import kz.arta.synergy.workflow.mobile.android.files.adapters.AdapterPath;
import kz.arta.synergy.workflow.mobile.android.files.models.Path;
import kz.arta.synergy.workflow.mobile.android.forms.general.components.users.model.UserModel;

/**
 * Created by neox on 04.07.16.
 * Экран "Ссылка на проект/портфель"
 */
public class ProjectChooserActivity extends Activity {

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

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

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

    /**
     * Боковая навигация
     */
    private SlidingMenu slidingMenu;

    /**
     * Данные компонента "Путь"
     */
    private List<Path> pathData;

    /**
     * Адаптер компонента "Путь"
     */
    private BaseAdapter pathAdapter;

    /**
     * Компонент "Путь"
     */
    private HorizontalListView pathList;

    /**
     * Контейнер для навигатора
     */
    private LinearLayout navigatorLayout;

    /**
     * Данные основного списка
     */
    private List<ProjectModel.ProjectItem> projectList;

    /**
     * Адаптер для основного списка
     */
    private ProjectListAdapter projectAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

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

        activity = this;

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

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

        init();
    }

    /**
     * Инициализация компонентов
     */
    private void init() {

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

        ImageView showNavigator = (ImageView) findViewById(R.id.project_link_icon_show_navigator);
        showNavigator.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                slidingMenu.toggle();
            }
        });

        // компонент "Путь"
        pathData = new ArrayList<>();
        pathAdapter = new AdapterPath(activity, pathData);
        pathList = (HorizontalListView) findViewById(R.id.project_link_path);
        pathList.setAdapter(pathAdapter);
        pathList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                // все элементы отмечаем как "невыделенные"
                for (Path path : pathData) {
                    path.setSelected(false);
                }
                // говорим элемент, по которому происходит тап - будет выделен
                pathData.get(i).setSelected(true);
                searchListItem(navigatorLayout, pathData.get(i).getNodeID());
            }
        });

        projectList = new ArrayList<>();
        projectAdapter = new ProjectListAdapter(this, projectList);

        // основной список
        ListView users = (ListView) findViewById(R.id.project_link_list);
        users.setAdapter(projectAdapter);
        users.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                for (int i = 0; i < projectList.size(); i++) {
                    projectList.get(i).setSelected(false);
                }
                projectList.get(position).setSelected(true);
                projectAdapter.notifyDataSetChanged();
            }
        });

        // боковая навигация
        View view = getLayoutTree();
        slidingMenu = new SlidingMenu(getApplicationContext());
        slidingMenu.setMode(SlidingMenu.RIGHT);
        slidingMenu.attachToActivity(activity, SlidingMenu.SLIDING_CONTENT);
        slidingMenu.setMenu(view);
        slidingMenu.setBehindWidth(Utils.convertDpToPixel(Const.SLIDING_MENU_WIDTH, activity));

        navigatorLayout = (LinearLayout) view.findViewById(R.id.filters_list);

        getItems(navigatorLayout);

        // кнопка "Сохранить"
        Button save = (Button) findViewById(R.id.project_link_button_save);
        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProjectModel.ProjectItem selectedItem = getSelectedItem();
                if (selectedItem == null) {
                    AppMsg.makeText(activity, getString(R.string.element_not_selected), AppMsg.STYLE_ALERT).show();
                    return;
                }
                Intent intent = new Intent();
                intent.putExtra(ActivityConst.SELECTED, selectedItem);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }

    /**
     * Метод возвращает позицию выделенного элемента
     *
     * @return выделенный элемент
     */
    private ProjectModel.ProjectItem getSelectedItem() {
        for (ProjectModel.ProjectItem item : projectList) {
            if (item.isSelected()) {
                return item;
            }
        }
        return null;
    }

    /**
     * Метод возвращает view навигатора
     *
     * @return view
     */
    private View getLayoutTree() {
        LayoutInflater ltInflater = getLayoutInflater();
        View view = ltInflater.inflate(R.layout.fragment_filters, null, false);
        (view.findViewById(R.id.sync_button_title)).setVisibility(View.GONE);
        (view.findViewById(R.id.sync_icon)).setVisibility(View.GONE);
        (view.findViewById(R.id.sync_button)).setVisibility(View.GONE);
        (view.findViewById(R.id.icon_settings)).setVisibility(View.GONE);
        ((TextView) view.findViewById(R.id.title_action_bar_filters)).setTypeface(Fonts.getMedium(activity));
        return view;
    }

    /**
     * Метод заполняет данными компонент "путь"
     *
     * @param pathItems элементы пути
     */
    public void initPath(List<UserModel> pathItems) {
        // очистка пути
        pathData.clear();
        for (int i = 0; i < pathItems.size(); i++) {
            Path path = new Path();
            path.setName(pathItems.get(i).getDepartmentName());
            path.setNodeID(pathItems.get(i).getUuid());
            pathData.add(path);
            if (i == pathItems.size() - 1) {
                path.setSelected(true);
            }
        }
        // обновляем компонент
        pathAdapter.notifyDataSetChanged();
        // скроллим список до конца
        pathList.scrollTo(Integer.MAX_VALUE);
    }

    /**
     * Метод добавляет плашку департаментов
     *
     * @param layout контейнер
     */
    public void getItems(final LinearLayout layout) {

        new SendGetRequest("rest/api/projects/get_project_tree", person) {
            @Override
            protected void onPostExecute(String result) {

                progressBar.setVisibility(View.GONE);

                if (result == null) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                    return;
                }

                try {

                    ProjectModel projectModel = RestClient.getGson().fromJson(result, ProjectModel.class);

                    UserModel userModel = new UserModel();
                    userModel.setDepartmentName(projectModel.getName());

                    List<UserModel> parents = new ArrayList<>();
                    parents.add(userModel);

                    ProjectChooserNavigator item = new ProjectChooserNavigator(activity);
                    item.setPerson(person);
                    item.setLevel(1);
                    item.setParents(parents);
                    item.setName(projectModel.getName());
                    item.add();
                    item.setSelected();
                    item.expand();
                    item.tapItem();

                    layout.addView(item);

                } catch (Exception exc) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                }
            }
        }.execute();
    }

    /**
     * Метод вызывается при нажатии на элемент пути
     *
     * @param layout контейнер
     * @param uuid   идентификатор элемента
     */
    private void searchListItem(LinearLayout layout, String uuid) {
        for (int i = 0; i < layout.getChildCount(); i++) {
            if (layout.getChildAt(i) instanceof ProjectChooserNavigator) {
                ProjectChooserNavigator node = (ProjectChooserNavigator) layout.getChildAt(i);
                if (uuid != null && uuid.equals(node.getItemID())) {
                    node.setSelected();
                    node.tapItem();
                    return;
                } else if (uuid == null) {
                    node.setSelected();
                    node.tapItem();
                    return;
                }
                searchListItem(node, uuid);
            }
        }
    }

    /**
     * Метод получает список портфелей и проектов с сервера
     *
     * @param itemID идентификатор родителя
     */
    public void getItems(String itemID) {
        new SendGetRequest("rest/api/projects/get_project_tree" + (itemID == null ? "" : "?itemID=" + itemID), person) {
            @Override
            protected void onPostExecute(String result) {
                progressBar.setVisibility(View.GONE);
                if (result == null) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                    return;
                }
                try {
                    ProjectModel projectItem = RestClient.getGson().fromJson(result, ProjectModel.class);
                    projectList.clear();
                    for (ProjectModel.ProjectItem item : projectItem.getItems()) {
                        projectList.add(item);
                    }
                    projectAdapter.notifyDataSetChanged();
                } catch (Exception exc) {
                    AppMsg.makeText(activity, getString(R.string.error_request), AppMsg.STYLE_ALERT).show();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

    @Override
    public void onBackPressed() {
        if (slidingMenu.isMenuShowing()) {
            hideMenu();
        } else {
            super.onBackPressed();
        }
    }

    /**
     * Закрытие боковой навигации
     */
    public void hideMenu() {
        slidingMenu.toggle();
    }

    public class ProjectListAdapter extends ArrayAdapter<ProjectModel.ProjectItem> {

        /**
         * Конструктор адаптера списка портфелей и проектов
         *
         * @param context контекст
         * @param users   список пользователей
         */
        public ProjectListAdapter(Context context, List<ProjectModel.ProjectItem> users) {
            super(context, R.layout.users_chooser_activity, users);
        }

        @Override
        public View getView(int position, View someView, ViewGroup arg2) {

            LayoutInflater inflater = LayoutInflater.from(activity);

            if (someView == null) {
                someView = inflater.inflate(R.layout.item_users_list, arg2, false);
            }

            someView.setBackgroundColor(getResources().getColor((projectList.get(position).isSelected()
                    ? R.color.selected_item_list_color : android.R.color.transparent)));

            TextView userName = (TextView) someView.findViewById(R.id.item_users_name);
            userName.setText(projectList.get(position).getName());
            userName.setTypeface(Fonts.getRoman(activity));

            TextView userPosition = (TextView) someView.findViewById(R.id.item_users_position);
            userPosition.setText((projectList.get(position).getElementType().
                    equals(ProjectConst.PORTFOLIO) ? getString(R.string.portfolio) : getString(R.string.project)));
            userPosition.setTypeface(Fonts.getRoman(activity));

            someView.findViewById(R.id.item_users_checkbox_image).setVisibility(View.GONE);
            someView.findViewById(R.id.item_users_checker_image).setVisibility(View.GONE);

            return someView;
        }
    }
}
