import React from 'react';
import ReactModal from 'react-modal';
import Link from 'component/link';


export const Modal = React.createClass({
  propTypes: {
    type: React.PropTypes.oneOf(['alert', 'confirm', 'custom']),
    overlay: React.PropTypes.bool,
    onConfirmed: React.PropTypes.func,
    onAborted: React.PropTypes.func,
    confirmButtonLabel: React.PropTypes.string,
    abortButtonLabel: React.PropTypes.string,
    confirmButtonDisabled: React.PropTypes.bool,
    abortButtonDisabled: React.PropTypes.bool,
  },
  getDefaultProps: function() {
    return {
      type: 'alert',
      overlay: true,
      confirmButtonLabel: 'OK',
      abortButtonLabel: 'Cancel',
      confirmButtonDisabled: false,
      abortButtonDisabled: false,
    };
  },
  render: function() {
    return (
      <ReactModal onCloseRequested={this.props.onAborted || this.props.onConfirmed} {...this.props}
                  className={(this.props.className || '') + ' modal'}
                  overlayClassName={[null, undefined, ""].indexOf(this.props.overlayClassName) === -1 ? this.props.overlayClassName : 'modal-overlay'}>
        <div>
          {this.props.children}
        </div>
        {this.props.type == 'custom' // custom modals define their own buttons
          ? null
          : <div className="modal__buttons">
             <Link button="primary" label={this.props.confirmButtonLabel} className="modal__button" disabled={this.props.confirmButtonDisabled} onClick={this.props.onConfirmed} />
             {this.props.type == 'confirm'
               ? <Link button="alt" label={this.props.abortButtonLabel} className="modal__button" disabled={this.props.abortButtonDisabled} onClick={this.props.onAborted} />
               : null}
            </div>}
      </ReactModal>
    );
  }
});

export const ExpandableModal = React.createClass({
  propTypes: {
    expandButtonLabel: React.PropTypes.string,
    extraContent: React.PropTypes.element,
  },
  getDefaultProps: function() {
    return {
      confirmButtonLabel: 'OK',
      expandButtonLabel: 'Show More...',
      hideButtonLabel: 'Show Less',
    }
  },
  getInitialState: function() {
    return {
      expanded: false,
    }
  },
  toggleExpanded: function() {
    this.setState({
      expanded: !this.state.expanded,
    });
  },
  render: function() {
    return (
      <Modal type="custom" {... this.props}>
        {this.props.children}
        {this.state.expanded
          ? this.props.extraContent
          : null}
        <div className="modal__buttons">
          <Link button="primary" label={this.props.confirmButtonLabel} className="modal__button" onClick={this.props.onConfirmed} />
          <Link button="alt" label={!this.state.expanded ? this.props.expandButtonLabel : this.props.hideButtonLabel}
                className="modal__button" onClick={this.toggleExpanded} />
        </div>
      </Modal>
    );
  }
});

export default Modal;