import { isFunction } from '../common/validator';
import { getCurrentPage, isDef } from '../common/utils';

type IPageScrollOption = WechatMiniprogram.Page.IPageScrollOption;
type Scroller = (
  this: WechatMiniprogram.Component.TrivialInstance,
  event?: IPageScrollOption
) => void;

function onPageScroll(event?: IPageScrollOption) {
  const { vanPageScroller = [] } = getCurrentPage<{
    vanPageScroller: Scroller[];
  }>();

  vanPageScroller.forEach((scroller: Scroller) => {
    if (typeof scroller === 'function') {
      // @ts-ignore
      scroller(event);
    }
  });
}

export function pageScrollMixin(scroller: Scroller) {
  return Behavior({
    attached(this: WechatMiniprogram.Component.TrivialInstance) {
      const page = getCurrentPage<{ vanPageScroller: Scroller[] }>();

      if (!isDef(page)) {
        return;
      }

      const _scroller = scroller.bind(this);

      const { vanPageScroller = [] } = page;

      if (isFunction(page.onPageScroll) && page.onPageScroll !== onPageScroll) {
        vanPageScroller.push(page.onPageScroll.bind(page));
      }

      vanPageScroller.push(_scroller);

      page.vanPageScroller = vanPageScroller;
      page.onPageScroll = onPageScroll;

      this._scroller = _scroller;
    },

    detached(this: WechatMiniprogram.Component.TrivialInstance) {
      const page = getCurrentPage<{ vanPageScroller: Scroller[] }>();

      if (!isDef(page) || !isDef(page.vanPageScroller)) {
        return;
      }

      const { vanPageScroller } = page;

      const index = vanPageScroller.findIndex((v) => v === this._scroller);

      if (index > -1) {
        page.vanPageScroller.splice(index, 1);
      }

      this._scroller = undefined;
    },
  });
}