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

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.devspark.appmsg.AppMsg;

import java.util.ArrayList;
import java.util.List;

import kz.arta.synergy.workflow.mobile.android.R;
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.Utils;
import kz.arta.synergy.workflow.mobile.android.files.FilesConst;
import kz.arta.synergy.workflow.mobile.android.forms.general.components.users.model.UserModel;

/**
 * Created by neox on 17.03.16.
 * Элемент списка
 */
public class ProjectChooserNavigator extends LinearLayout {

    /**
     * Выделенный пункт
     */
    private static ProjectChooserNavigator selectedItem;
    /**
     * Активити
     */
    private Activity activity;
    /**
     * Данные пользователя
     */
    private Person person;
    /**
     * Имя текущей папки
     */
    private TextView elementName;
    /**
     * Иконка отображающая состояние ноды (свернута/развернута)
     */
    private ImageView icon;
    /**
     * Состояние текущей ноды (свернута/развернута)
     */
    private boolean state;
    /**
     * Уровень вложенности текущего элемента
     */
    private int level;
    /**
     * Имя
     */
    private String name;
    /**
     * Скрывать ли иконку
     */
    private boolean hideIcon;
    /**
     * Родители текущей ноды
     */
    private List<UserModel> parents;

    /**
     * Идентификатор элемента
     */
    private String itemID;

    /**
     * Конструктор
     *
     * @param activity активити
     */
    public ProjectChooserNavigator(Activity activity) {
        super(activity);
        this.activity = activity;
    }

    /**
     * Метод добавляет в список view
     */
    public void add() {

        setOrientation(LinearLayout.VERTICAL);
        setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
        setBackgroundColor(getResources().getColor(R.color.background_color_filters));

        LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        RelativeLayout contentLayout = (RelativeLayout) layoutInflater.inflate(R.layout.filters_item, null);
        contentLayout.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                ((ProjectChooserActivity) activity).hideMenu();
                tapItem();
                setSelected();
            }
        });

        // имя текущей папки
        elementName = (TextView) contentLayout.findViewById(R.id.name_filter);
        elementName.setText(name);
        elementName.setTypeface(Fonts.getRoman(activity));
        elementName.setTextColor(getResources().getColor(R.color.not_selected_filter_item));

        // отступ слева
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        // максимальное количество уровней со смещением - 8
        params.setMargins(Utils.dpToPx(FilesConst.DP_MARGIN_LEFT, activity) * (level < FilesConst.OFFSET_LEVELS ? level : FilesConst.OFFSET_LEVELS), 0, 0, 0);
        elementName.setLayoutParams(params);

        // иконка
        icon = (ImageView) contentLayout.findViewById(R.id.icon_filter);
        icon.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (state) {
                    collapse();
                } else {
                    expand();
                }
            }
        });

        if (hideIcon) {
            icon.setVisibility(View.GONE);
        }

        addView(contentLayout);
    }

    /**
     * Нажатие на плашку в дереве
     */
    public void tapItem() {
        ProjectChooserActivity parentActivity = (ProjectChooserActivity) activity;
        parentActivity.getItems(itemID);
        parentActivity.initPath(parents);
    }

    /**
     * Метод окрашивает цвет текста текущего элемента
     */
    public void setSelected() {
        if (selectedItem != null) {
            selectedItem.elementName.setTextColor(Color.LTGRAY);
        }
        selectedItem = ProjectChooserNavigator.this;
        elementName.setTextColor(getResources().getColor(R.color.selected_filter_item));
    }

    /**
     * Сворачивание текущей ноды
     */
    public void collapse() {
        level--;
        for (int i = getChildCount() - 1; i >= 1; i--) {
            removeViewAt(i);
        }
        state = false;
        icon.setImageResource(R.drawable.filters_undetailed);
        setSelected();
        tapItem();
    }

    /**
     * Раскрытие текущей ноды
     */
    public void expand() {
        level++;
        state = true;
        icon.setImageResource(R.drawable.filters_detailed);
        getItems();
    }

    /**
     * Метод загружает департаменты
     */
    public void getItems() {
        new SendGetRequest("rest/api/projects/get_project_tree" + (level <= 2 ? "" : "?itemID=" + itemID), person) {
            @Override
            protected void onPostExecute(String result) {

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

                try {

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

                    if (haveProjects(project.getItems())) {
                        icon.setVisibility(View.GONE);
                    }

                    for (ProjectModel.ProjectItem projectItem : project.getItems()) {

                        if (projectItem.getElementType().equals(ProjectConst.PROJECT)) {
                            continue;
                        }

                        UserModel userModel = new UserModel();
                        userModel.setDepartmentName(projectItem.getName());
                        userModel.setUuid(projectItem.getItemID());

                        List<UserModel> parentNodes = new ArrayList<>();
                        for (UserModel user : parents) {
                            parentNodes.add(user);
                        }
                        parentNodes.add(userModel);

                        ProjectChooserNavigator item = new ProjectChooserNavigator(activity);
                        item.setPerson(person);
                        item.setName(projectItem.getName());
                        item.setItemID(projectItem.getItemID());
                        item.setLevel(level);
                        item.setParents(parentNodes);
                        item.setHideIcon(!Boolean.parseBoolean(projectItem.getHasChildren()));
                        item.setActivity(activity);
                        item.add();

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

    /**
     * Метод смотрит имеются ли в списке хотя бы один проект, если да - возвращает true
     *
     * @param items список портфелей и проектов
     * @return true/false
     */
    private boolean haveProjects(List<ProjectModel.ProjectItem> items) {
        for (ProjectModel.ProjectItem item : items) {
            if (item.getElementType().equals(ProjectConst.PROJECT)) {
                return true;
            }
        }
        return false;
    }

    public String getItemID() {
        return itemID;
    }

    public void setItemID(String itemID) {
        this.itemID = itemID;
    }

    public void setActivity(Activity activity) {
        this.activity = activity;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public void setHideIcon(boolean hideIcon) {
        this.hideIcon = hideIcon;
    }

    public void setParents(List<UserModel> parents) {
        this.parents = parents;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
