<:Window bind:innerHeight />
<Nav page={{page}} />

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

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

  const SCROLL_EVENT_DELAY = 300
  const RESIZE_EVENT_DELAY = 700

	export default {
	  oncreate() {
      mark('onCreate Layout')
      let node = this.refs.node
      this.observe('innerHeight', debounce(() => {
        // respond to window resize events
        this.store.set({
          offsetHeight: node.offsetHeight
        })
      }, RESIZE_EVENT_DELAY))
	    this.store.set({
        scrollTop: node.scrollTop,
        scrollHeight: node.scrollHeight,
        offsetHeight: node.offsetHeight
      })
      stop('onCreate Layout')
    },
		components: {
			Nav
		},
    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.set({
          scrollTop: event.target.scrollTop,
          scrollHeight: event.target.scrollHeight
        })
      },
      onFullscreenChange() {
        mark('onFullscreenChange')
        console.log('is fullscreen? ', isFullscreen())
        this.set({ fullscreen: isFullscreen() })
        stop('onFullscreenChange')
      }
    }
	};
</script>