/**
 * Server mixin.
 * @module ApServerMixin
 *
 * Generated by coz on 3/6/2016,
 * from a template provided by apeman-bud-react.
 *
 * @see https://facebook.github.io/react/
 */
'use strict'

import defaults from 'defaults'
import assert from 'assert'
import Promise, {untilResolved} from 'apemanpromise'

/** @lends ApServerMixin */
let ApServerMixin = {

  // --------------------
  // Custom
  // --------------------
  $apServerMixed: true,

  // --------------------
  // Lifecycle
  // --------------------

  componentWillMount () {
    const s = this
    assert(s.getServerEventSource, '.getServerEventSource() is required.')
    assert(s.getServerPollingConfig, '.getServerPollingConfig() is required.')
    assert(s.knockServer, '.knockServer() is required.')
    let noop = (value) => value
    defaults(s, {
      serverWillRestart: noop,
      serverDidRestart: noop,
      serverDidGone: noop
    })
  },

  componentDidMount () {
    const s = this

    let es = s.getServerEventSource()
    if (es) {
      es.addEventListener('server:restart', s.handleServerRestart)
      s._serverES = es
    }
  },

  componentWillUnmount () {
    const s = this
    let es = s._serverES
    if (es) {
      es.removeEventListener('server:restart', s.handleServerRestart)
      es.close()
    }
  },

  // --------------------
  // Custom
  // --------------------

  handleServerRestart (e) {
    const s = this
    s.serverWillRestart()
    let pollingConfig = s.getServerPollingConfig()
    untilResolved(
      () => Promise.resolve(s.knockServer()),
      pollingConfig
    )
      .then((res) => {
        s.serverDidRestart()
      })
      .catch((err) => {
        s.serverDidGone()
      })
  },

  // --------------------
  // Private
  // --------------------

  _serverES: undefined

}

export default Object.freeze(ApServerMixin)
