var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { SuperComponent, wxComponent } from '../common/src/index';
import config from '../common/config';
import props from './props';
const { prefix } = config;
const classPrefix = `${prefix}-indexes`;
const topOffset = 40;
let IndexBar = class IndexBar extends SuperComponent {
    constructor() {
        super(...arguments);
        this.externalClasses = [`${prefix}-class`, `${prefix}-class-index`];
        this.properties = props;
        this.observers = {
            list(newValue) {
                let groups = newValue;
                if (!!newValue.length && newValue[0].title === undefined) {
                    groups = groups.map((g) => {
                        return Object.assign({ title: g.index }, g);
                    });
                }
                this.setData({ groups });
            },
            height() {
                this.getDomInfo();
            },
        };
        this.data = {
            prefix,
            classPrefix,
            clientHeight: 0,
            groups: [],
            activeGroup: null,
            currentGroup: null,
            showScrollTip: false,
        };
        this.timer = null;
        this.groupTop = null;
        this.btnBar = null;
    }
    ready() {
        this.getHeight();
    }
    getHeight() {
        wx.getSystemInfo({
            success: (res) => {
                this.setData({
                    clientHeight: res.windowHeight,
                }, () => {
                    this.getDomInfo();
                });
            },
        });
    }
    getDomInfo() {
        const query = this.createSelectorQuery();
        query.select(`#id-${classPrefix}__bar`).boundingClientRect();
        query.selectAll(`.${classPrefix}__group`).boundingClientRect();
        query.exec((res) => {
            if (!res[0])
                return;
            this.btnBar = {
                top: res[0].top,
                height: res[0].height,
                itemHeight: res[0].height / this.data.groups.length,
            };
            if (!res[1])
                return;
            this.groupTop = res[1].map((element) => element.height);
            this.groupTop.reduce((acc, cur, index) => {
                const amount = acc + cur;
                this.groupTop[index] = amount;
                return amount;
            });
        });
    }
    computedIndex(tapY) {
        const offsetY = tapY - this.btnBar.top;
        let index;
        if (offsetY < 0) {
            index = 0;
        }
        else if (offsetY > this.btnBar.height) {
            index = this.data.groups.length - 1;
        }
        else {
            index = Math.floor(offsetY / this.btnBar.itemHeight);
        }
        return index;
    }
    computedIndexByScrollTop(scrollTop) {
        if (!this.groupTop) {
            return -1;
        }
        return this.groupTop.findIndex((element) => element - topOffset > scrollTop);
    }
    activeIndexWhenScroll(scrollTop) {
        const curIndex = this.computedIndexByScrollTop(scrollTop);
        if (curIndex >= 0) {
            this.setData({
                activeGroup: this.data.groups[curIndex],
            });
        }
    }
    scrollToY(tapY) {
        const index = this.computedIndex(tapY);
        this.scrollToAnchor(index);
    }
    scrollToAnchor(index) {
        this.switchScrollTip(true);
        const curGroup = this.data.groups[index];
        this.setData({
            activeGroup: curGroup,
            currentGroup: curGroup,
        });
    }
    switchScrollTip(val) {
        val = !!val;
        const switchFun = (value) => {
            if (this.data.showScrollTip === value) {
                return;
            }
            this.setData({
                showScrollTip: value,
            });
        };
        if (!val) {
            clearInterval(this.timer);
            this.timer = setTimeout(() => {
                switchFun(false);
            }, 300);
        }
        else {
            switchFun(true);
        }
    }
    throttleScroll() {
        return new Promise((resolve) => {
            const delay = 100;
            const now = Date.now();
            if (this.lastScrollTime && this.lastScrollTime + delay > now) {
                if (this.scrollTimer) {
                    clearTimeout(this.scrollTimer);
                }
                this.scrollTimer = setTimeout(() => {
                    this.lastScrollTime = now;
                    resolve();
                }, delay);
            }
            else {
                this.lastScrollTime = now;
                resolve();
            }
        });
    }
    onTouchStart() { }
    onTouchMove(e) {
        this.throttleScroll().then(() => this.scrollToY(e.changedTouches[0].pageY));
    }
    onTouchCancel() {
        this.switchScrollTip(false);
    }
    onTouchEnd(e) {
        this.switchScrollTip(false);
        this.scrollToY(e.changedTouches[0].pageY);
    }
    onCellTap(e) {
        const { indexes } = e.currentTarget.dataset;
        this.triggerEvent('select', { indexes });
    }
    onListScroll(e) {
        this.throttleScroll().then(() => {
            const { scrollTop } = e.detail;
            this.activeIndexWhenScroll(scrollTop);
        });
    }
};
IndexBar = __decorate([
    wxComponent()
], IndexBar);
export default IndexBar;
