/**
 * AdminNewsList view
 *
 * Generated by coz on 2017-01-06,
 * from a template provided by apeman-asset-templates.
 *
 * @function AdminNewsListView
 */
'use strict'

import React, { Component, PropTypes as types } from 'react'
import defineDebug from 'debug'
import {
  ApView, ApViewHeader, ApViewBody, ApViewFooter
} from 'apeman-react-basic'
import { NewsList } from '../../fragments'
import {
  asConnected,
  asView,
  asLocaled,
  asServed,
  forSpin,
  forList, combine
} from '../../wrappers'

import { IconClasses } from 'ore-fol-enums'

const debug = defineDebug('project:view:admin-news-list')
const { NEWS_ICON } = IconClasses

/** @lends AdminNewsListView */
class AdminNewsListView extends Component {
  // --------------------
  // Specs
  // --------------------
  static get propTypes () {
    return {}
  }

  static get defaultProps () {
    return {}
  }

  render () {
    const s = this
    const {
      props,
      l
    } = s
    let { news } = props
    return (
      <ApView id='admin-news-list-view'
              className='view admin-view'
              spinning={ props.spinning }
              way={ props.way }
      >
        <ApViewHeader onLeftTap={ s.handlePop }
                      leftText={ null }
                      leftIcon={ props.popIcon }
                      titleText={ null }
                      titleIcon={ NEWS_ICON }
                      onRightTap={ null }
                      rightIcon={ null }
                      rightText={ null }
        />

        <ApViewBody>
          {
            news ? (
                <NewsList news={ news.entities }
                          alt={ l('alt.NO_NEWS_FOUND') }
                          hasMore={ news.more }
                          moreText={ l('buttons.SHOW_MORE') }
                          onMore={ s.handleMore }
                          moreSpinning={ props.moreSpinning }
                />
              ) : null
          }
        </ApViewBody>
      </ApView>
    )
  }

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

  componentWillMount () {
    debug('willMount')
    const s = this
  }

  componentDidMount () {
    debug('didMount')
    const s = this

    s.loadNews()
  }

  componentWillUnmount () {
    debug('willUnmount')
    const s = this
  }

  // --------------------
  // Handlers
  // --------------------

  handleMore () {
    const s = this
    const { props } = s
    let { news } = props
    let { next: offset } = news.counts
    s.loadMoreNews({ offset })
  }

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

  loadNews () {
    const s = this
    const { use } = s.service('apiService')
    return s.applySpinWhile(() =>
      use('newsApi').then((newsApi) =>
        s.applyListLoad({
          news: () => newsApi.list({})
        })
      )
    )
  }

  loadMoreNews ({ offset }) {
    const s = this
    const { use } = s.service('apiService')
    return s.applySpinWhile({
      moreSpinning: () =>
        use('newsApi').then((newsApi) =>
          s.applyListMore({
            news: () => newsApi.list({ offset })
          })
        )
    })
  }

}

export default combine(
  asServed(), forSpin(),
  forList(),
  asLocaled(), asView(),
  asConnected()
)(AdminNewsListView)

