import React from 'react'
import { Helmet } from 'react-helmet'
import { connect } from 'react-redux'

import { deleteData, updateData } from '../../../actions/index'

class AdminDetail extends React.Component {

  constructor(props, context) {
    super(props, context)
    this.state = {
      isInEdition: false,
    }
  }

  render() {
    const {
      message,
      onDataUpdate,
      onDataDelete,
      results,
      target,
    } = this.props
    const { isInEdition } = this.state
    const title = target.charAt(0).toUpperCase() + target.slice(1)

    return (
      <div>
        <Helmet>
          <title>mpwo - Admin</title>
        </Helmet>
        <h1 className="page-title">
            Administration - {title}
        </h1>
        {message ? (
          <code>{message}</code>
        ) : (
          results.length === 1 && (
          <div className="container">
            <div className="row">
              <div className="col-md-2" />
              <div className="col-md-8 card">
                <div className="card-body">
                  <form onSubmit={event =>
                   event.preventDefault()}
                  >
                    { results.map(result => (
                      Object.keys(result).map(key => (
                        <div className="form-group" key={key}>
                          <label>
                            {key}:
                            <input
                              className="form-control input-lg"
                              name={key}
                              readOnly={key === 'id' || !isInEdition}
                              defaultValue={result[key]}
                            />
                          </label>
                        </div>
                      ))
                    ))}
                    {isInEdition ? (
                      <div>
                        <input
                          type="submit"
                          className="btn btn-primary btn-lg btn-block"
                          onClick={event => {
                              onDataUpdate(event, target)
                              this.setState({ isInEdition: false })
                            }
                          }
                          value="Submit"
                        />
                        <input
                          type="submit"
                          className="btn btn-secondary btn-lg btn-block"
                          onClick={event => {
                            event.target.form.reset()
                            this.setState({ isInEdition: false })
                          }}
                          value="Cancel"
                        />
                      </div>
                    ) : (
                      <div>
                        <input
                          type="submit"
                          className="btn btn-primary btn-lg btn-block"
                          onClick={() => this.setState({ isInEdition: true })}
                          value="Edit"
                        />
                        <input
                          type="submit"
                          className="btn btn-danger btn-lg btn-block"
                          onClick={event => onDataDelete(event, target)}
                          value="Delete"
                        />
                      </div>
                    )}
                  </form>
                </div>
              </div>
              <div className="col-md-2" />
            </div>
          </div>
          )
        )}
      </div>
    )
  }
}

export default connect(
  state => ({
    message: state.message,
  }),
  dispatch => ({
    onDataDelete: (e, target) => {
      const id = e.target.form.id.value
      dispatch(deleteData(target, id))
    },
    onDataUpdate: (e, target) => {
      const data = [].slice
        .call(e.target.form.elements)
        .reduce(function(map, obj) {
          if (obj.name) {
            map[obj.name] = obj.value
          }
          return map
        }, {})
      dispatch(updateData(target, data))
    },
  })
)(AdminDetail)