/**
 * RecoverReset view
 *
 * Generated by coz on 2016-11-07,
 * from a template provided by apeman-asset-templates.
 *
 * @function RecoverResetView
 */
'use strict'

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

import { RecoverResetForm } from '../../fragments'

const debug = defineDebug('project:view:recover-reset')

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

  static get defaultProps () {
    return {}
  }

  render () {
    const s = this
    let {
      props
    } = s
    return (
      <ApView headerless
              id='recover-reset-view'
              className='view'
              spinning={ props.spinning }
              way={ props.way }
      >
        <ApViewHeader onLeftTap={ null }
                      leftText={ null }
                      leftIcon={ null }
                      titleText={ null }
                      titleIcon={ null }
                      onRightTap={ null }
                      rightIcon={ null }
                      rightText={ null }
        />

        <ApViewBody>
          <RecoverResetForm spinning={ props.spinning }
                            values={ props.entryValues }
                            onUpdate={ s.handleEntryUpdate }
                            errors={ props.entryErrors }
                            onSubmit={ s.handleSubmit }
          />
        </ApViewBody>
      </ApView>
    )
  }

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

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

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

    s.handleEntryClear()

    s.loadRecover()
  }

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

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

  handleSubmit () {
    const s = this
    const { props, l } = s
    const { infoToast } = s.service('toastService')
    const { use } = s.service('apiService')
    let { token, entryValues } = props
    let { password } = entryValues
    return s.applySpinWhile(() =>
      use('recoverApi').then((recoverApi) =>
        recoverApi.update({ token, password })
          .then(() => {
            infoToast(l('toasts.UPDATE_SUCCESS'))
            s.handlePush('RecoverResetDone', {})
          })
      )
    )
  }

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

  loadRecover () {
    const s = this
    const { use } = s.service('apiService')
    let { token } = s.props
    s.applySpinWhile(() =>
      use('recoverApi').then((recoverApi) =>
        recoverApi.check({ token })
          .catch((err) => {
            console.error(err)
            s.handlePush('ErrorInvalid')
          })
      )
    )
  }
}

export default combine(
  asServed(),
  forSpin(),
  forEntry(),
  asLocaled(),
  asView(),
  asConnected()
)(RecoverResetView)

