import React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { defineMessages, injectIntl } from 'react-intl'
import ImmutablePropTypes from 'react-immutable-proptypes'
import ImmutablePureComponent from 'react-immutable-pure-component'
import classNames from 'classnames/bind'
import { loadStatusRevisions } from '../../actions/status_revisions'
import ModalLayout from './modal_layout'
import RelativeTimestamp from '../relative_timestamp'
import Text from '../text'

const cx = classNames.bind(_s)

const messages = defineMessages({
  title: { id: 'status_revisions.heading', defaultMessage: 'Revision History' },
})

const mapStateToProps = (state) => ({
  loading: state.getIn(['status_revisions', 'loading']),
  error: state.getIn(['status_revisions', 'error']),
  revisions: state.getIn(['status_revisions', 'revisions']),
})

const mapDispatchToProps = (dispatch) => ({
  onLoadStatusRevisions(statusId) {
    dispatch(loadStatusRevisions(statusId))
  },
})

export default
@injectIntl
@connect(mapStateToProps, mapDispatchToProps)
class StatusRevisionsModal extends ImmutablePureComponent {

  static propTypes = {
    intl: PropTypes.object.isRequired,
    status: ImmutablePropTypes.map.isRequired,
    onLoadStatusRevisions: PropTypes.func.isRequired,
    loading: PropTypes.bool.isRequired,
    error: PropTypes.bool,
    revisions: ImmutablePropTypes.list.isRequired,
    onClose: PropTypes.func.isRequired,
  }

  componentDidMount() {
    this.props.onLoadStatusRevisions(this.props.status.get('id'))
  }

  render() {
    const {
      intl,
      status,
      revisions,
      onClose
    } = this.props

    return (
      <ModalLayout
        title={intl.formatMessage(messages.title)}
        width={480}
        onClose={onClose}
      >
        <div className={[_s.default]}>
          {
            revisions.map((revision, i) => {
              const isFirst = i === 0
              const isLast = i === revisions.size - 1

              const containerClasses = cx({
                default: 1,
                pt5: 1,
                pb10: 1,
                mt5: !isFirst,
                borderColorSecondary: !isLast,
                borderBottom1PX: !isLast,
              })

              return (
                <div key={`status-revision-${i}`} className={containerClasses}>
                  <div className={[_s.default, _s.pb5].join(' ')}>
                    <Text size='medium'>
                      {revision.get('text')}
                    </Text>
                  </div>
                  <div className={[_s.default]}>
                    <Text size='small' color='secondary'>
                      Edited on <RelativeTimestamp timestamp={revision.get('created_at')} />
                    </Text>
                  </div>
                </div>
              )
            })
          }
        </div>
      </ModalLayout>
    )
  }
}