package kz.arta.synergy.workflow.mobile.android.files.layouts;

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 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.files.fragments.FragmentFilesTree;
import kz.arta.synergy.workflow.mobile.android.files.models.FavoriteNode;
import kz.arta.synergy.workflow.mobile.android.files.models.Node;

/**
 * Created by neox on 01.10.15.
 * Дерево избранных папок
 */
public class FavoriteFoldersTree extends LinearLayout {

    /**
     * Фрагмент, содержащий в себе дерево
     */
    private FragmentFilesTree fragmentTree;

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

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

    /**
     * Имя текущей папки
     */
    private TextView elementName;

    /**
     * Иконка отображающая состояние ноды (свернута/развернута)
     */
    private ImageView icon;

    /**
     * Состояние текущей ноды (свернута/развернута)
     */
    private boolean state;

    /**
     * Список избранных папок
     */
    private FavoriteNode[] nodes;

    /**
     * Нода
     */
    private FavoriteNode node;

    /**
     * Конструктор
     *
     * @param text     имя папки
     * @param activity текущее активити
     * @param level    уровень вложенности
     */
    public FavoriteFoldersTree(String text, final Activity activity, int level) {

        super(activity);

        this.activity = activity;

        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) {
                // получение описания текущей ноды
                getNodeDesc();
            }
        });

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

        // отступ слева
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        params.setMargins(Utils.dpToPx(FilesConst.DP_MARGIN_LEFT, activity) * level, 0, 0, 0);
        elementName.setLayoutParams(params);

        // иконка отображающая состояние ноды (свернута/развернута)
        icon = (ImageView) contentLayout.findViewById(R.id.icon_filter);
        icon.setOnClickListener(new ItemClickListener());

        // если уровень больше, чем 1 - отображать иконку не нужно, потому что дерево имеет только один уровень
        if (level != 1) {
            icon.setVisibility(View.GONE);
        }

        addView(contentLayout);
    }

    /**
     * Получение описания ноды
     */
    private void getNodeDesc() {
        if (node == null) {
            return;
        }
        new SendGetRequest("rest/api/storage/description?elementID=" + node.getIdentifier(), person) {
            @Override
            protected void onPostExecute(String result) {
                if (result == null) {
                    AppMsg.makeText(activity, activity.getString(R.string.error_to_get_node_description), AppMsg.STYLE_ALERT).show();
                    return;
                }
                try {
                    Node node = RestClient.getGson().fromJson(result, Node.class);
                    node.getParents().add(node.getIdentifier());
                    fragmentTree.expandTree(node.getParents());
                    setSelected();
                } catch (Exception exc) {
                    AppMsg.makeText(activity, activity.getString(R.string.element_was_deleted), AppMsg.STYLE_ALERT).show();
                }
                super.onPostExecute(result);
            }
        }.execute();
    }

    /**
     * Выделение ноды
     */
    public void setSelected() {
        if (FragmentFilesTree.selectedFolderItem != null) {
            FragmentFilesTree.selectedFolderItem.elementName.setTextColor(Color.LTGRAY);
        }
        FragmentFilesTree.selectedFolderItem = FavoriteFoldersTree.this;
        elementName.setTextColor(getResources().getColor(R.color.selected_filter_item));
    }

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

    /**
     * Разворачивание текущей ноды
     */
    public void expand() {
        for (FavoriteNode node : nodes) {
            FavoriteFoldersTree favoriteFoldersTree = new FavoriteFoldersTree(node.getName(), activity, 2);
            favoriteFoldersTree.setNode(node);
            favoriteFoldersTree.setFragmentTree(fragmentTree);
            favoriteFoldersTree.setPerson(person);
            addView(favoriteFoldersTree);
        }
        state = true;
        icon.setImageResource(R.drawable.filters_detailed);
    }

    public TextView getElementName() {
        return elementName;
    }

    public void setIcon(ImageView icon) {
        this.icon = icon;
    }

    public void setState(boolean state) {
        this.state = state;
    }

    public void setNode(FavoriteNode node) {
        this.node = node;
    }

    public void setNodes(FavoriteNode[] nodes) {
        this.nodes = nodes;
    }

    public void setFragmentTree(FragmentFilesTree fragmentTree) {
        this.fragmentTree = fragmentTree;
    }

    public Person getPerson() {
        return person;
    }

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

    /**
     * Тап по изображению
     */
    private class ItemClickListener implements OnClickListener {
        public void onClick(View view) {
            if (state) {
                collapse();
            } else {
                expand();
            }
        }
    }
}