/**
 * @function withDialog
 */
'use strict'

import React from 'react'
import {wrap} from 'breact'
import {clone} from 'asobj'
import ApYesnoDialog from './ap_yesno_dialog'

function withDialog (Component) {
  return wrap(Component, {
    getInitialState () {
      return {
        dialog: null
      }
    },
    render () {
      const s = this
      let { props, state } = s
      let { dialog } = state
      let componentProps = clone(props, {
        without: []
      })
      return (
        <Component { ...componentProps}
                   askYesNoWithDialog={ s.askYesNo }
                   dialog={ dialog }
        />
      )
    },

    // --------------------
    // Custom
    // --------------------
    askYesNo ({ title, text, yesText, noText, closeIcon }) {
      const s = this
      return new Promise((resolve, reject) => {
        let dialog = (
          <ApYesnoDialog { ...{ title, yesText, noText, closeIcon } }
                         present
                         onYes={ () => resolve(true) }
                         onNo={ () => resolve(false) }
                         onClose={ () => resolve() }
          >{ text } </ApYesnoDialog>
        )
        s.setState({ dialog })
      })
        .then((answer) => {
          s.setState({ dialog: null })
          return answer
        })
        .catch((err) => {
          s.setState({ dialog: null })
          return Promise.reject(err)
        })
    }
  })
}

export default withDialog
