import { ButtonGroup } from "@/base";
import { ListLoader } from "./loader.list";
import { Layout, shortcut, Widget, extend, emptyFn, Controller, createWidget, Events, each, stripEL } from "@/core";

/**
 * Created by GUY on 2016/4/29.
 *
 * @class SortList
 * @extends Widget
 */
@shortcut()
export class SortList extends Widget {
    static xtype = "bi.sort_list";

    static EVENT_CHANGE = "EVENT_CHANGE";

    _defaultConfig() {
        return extend(super._defaultConfig(...arguments), {
            baseCls: "bi-sort-list",
            isDefaultInit: true, // 是否默认初始化数据
            // 下面是button_group的属性
            el: {
                type: ButtonGroup.xtype,
            },
            items: [],
            itemsCreator: emptyFn,
            onLoaded: emptyFn,
            // 下面是分页信息
            count: false,
            next: {},
            hasNext: emptyFn,
            // containment: this.element,
            // connectWith: ".bi-sort-list",
        });
    }

    _init() {
        super._init(...arguments);
        const o = this.options;
        this.loader = createWidget({
            type: ListLoader.xtype,
            element: this,
            isDefaultInit: o.isDefaultInit,
            el: o.el,
            items: this._formatItems(o.items),
            itemsCreator(op, callback) {
                o.itemsCreator(op, items => {
                    callback(this._formatItems(items));
                });
            },
            onLoaded: o.onLoaded,
            count: o.count,
            next: o.next,
            hasNext: o.hasNext,
        });
        this.loader.on(Controller.EVENT_CHANGE, (...args) => {
            const [type, value, obj] = args;
            this.fireEvent(Controller.EVENT_CHANGE, ...args);
            if (type === Events.CLICK) {
                this.fireEvent(SortList.EVENT_CHANGE, value, obj);
            }
        });

        this.loader.element.sortable({
            containment: o.containment || this.element,
            connectWith: o.connectWith || ".bi-sort-list",
            items: ".sort-item",
            cursor: o.cursor || "drag",
            tolerance: o.tolerance || "intersect",
            placeholder: {
                element($currentItem) {
                    const holder = createWidget({
                        type: Layout.xtype,
                        cls: "bi-sortable-holder",
                        height: $currentItem.outerHeight(),
                    });
                    holder.element.css({
                        "margin-left": $currentItem.css("margin-left"),
                        "margin-right": $currentItem.css("margin-right"),
                        "margin-top": $currentItem.css("margin-top"),
                        "margin-bottom": $currentItem.css("margin-bottom"),
                        margin: $currentItem.css("margin"),
                    });

                    return holder.element;
                },
                update() {},
            },
            start(event, ui) {},
            stop: (event, ui) => {
                this.fireEvent(SortList.EVENT_CHANGE);
            },
            over(event, ui) {},
        });
    }

    _formatItems(items) {
        each(items, (i, item) => {
            item = stripEL(item);
            item.cls = item.cls ? `${item.cls} sort-item` : "sort-item";
            item.attributes = {
                sorted: item.value,
            };
        });

        return items;
    }

    hasNext() {
        return this.loader.hasNext();
    }

    addItems(items) {
        this.loader.addItems(items);
    }

    populate(items) {
        if (items) {
            arguments[0] = this._formatItems(items);
        }
        this.loader.populate(...arguments);
    }

    empty() {
        this.loader.empty();
    }

    setNotSelectedValue() {
        this.loader.setNotSelectedValue(...arguments);
    }

    getNotSelectedValue() {
        return this.loader.getNotSelectedValue();
    }

    setValue() {
        this.loader.setValue(...arguments);
    }

    getValue() {
        return this.loader.getValue();
    }

    getAllButtons() {
        return this.loader.getAllButtons();
    }

    getAllLeaves() {
        return this.loader.getAllLeaves();
    }

    getSelectedButtons() {
        return this.loader.getSelectedButtons();
    }

    getNotSelectedButtons() {
        return this.loader.getNotSelectedButtons();
    }

    getIndexByValue(value) {
        return this.loader.getIndexByValue(value);
    }

    getNodeById(id) {
        return this.loader.getNodeById(id);
    }

    getNodeByValue(value) {
        return this.loader.getNodeByValue(value);
    }

    getSortedValues() {
        return this.loader.element.sortable("toArray", {
            attribute: "sorted",
        });
    }
}