<div class="container"
     on:scroll="onScroll(event)"
     on:fullscreen="onFullscreenChange()"
     ref:node>
  <slot></slot>
</div>
<script>
  import { virtualListStore } from './virtualListStore'

  import throttle from 'lodash/throttle'
  import { isFullscreen, attachFullscreenListener, detachFullscreenListener } from '../../_utils/fullscreen'
  import { mark, stop } from '../../_utils/marks'

  const SCROLL_EVENT_DELAY = 300

  export default {
    oncreate() {
      mark('onCreate VirtualListContainer')
      let node = this.refs.node
      let realm = this.get('realm')
      this.store.set({currentRealm: realm})
      let scrollTop = this.store.get('scrollTop')
      if (scrollTop > 0) {
        this.observe('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight => {
          console.log('allVisibleItemsHaveHeight', allVisibleItemsHaveHeight)
          if (!this.get('initializedScrollTop') && allVisibleItemsHaveHeight && node) {
            this.set({'initializedScrollTop': true})
            requestAnimationFrame(() => {
              mark('set scrollTop')
              console.log('forcing scroll top to ', scrollTop)
              node.scrollTop = scrollTop
              stop('set scrollTop')
            })
          }
        })
      } else {
        this.store.setForRealm({
          scrollHeight: node.scrollHeight,
          offsetHeight: node.offsetHeight
        })
      }
      stop('onCreate VirtualListContainer')
    },
    store: () => virtualListStore,
    events: {
      scroll(node, callback) {
        const onScroll = throttle(event => {
          mark('onScroll')
          if (this.get('fullscreen')) {
            return
          }
          callback(event)
          stop('onScroll')
        }, SCROLL_EVENT_DELAY, {
          leading: true,
          trailing: true
        })
        node.addEventListener('scroll', onScroll)

        return {
          teardown() {
            node.removeEventListener('scroll', onScroll)
          }
        }
      },
      fullscreen(node, callback) {
        const onFullscreen = (() => {
          callback()
        })
        attachFullscreenListener(onFullscreen)
        return {
          teardown() {
            detachFullscreenListener(onFullscreen)
          }
        }
      }
    },
    methods: {
      onScroll(event) {
        this.store.setForRealm({
          scrollTop: event.target.scrollTop,
          scrollHeight: event.target.scrollHeight
        })
      },
      onFullscreenChange() {
        mark('onFullscreenChange')
        console.log('is fullscreen? ', isFullscreen())
        this.set({ fullscreen: isFullscreen() })
        stop('onFullscreenChange')
      }
    },
    computed: {
      // TODO: bug in svelte/store – the observer in oncreate() never get removed without this hack
      allVisibleItemsHaveHeight: ($allVisibleItemsHaveHeight) => $allVisibleItemsHaveHeight
    }
  };
</script>