/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

const {
  Component,
} = require("resource://devtools/client/shared/vendor/react.js");
const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.js");
const {
  button,
  span,
} = require("resource://devtools/client/shared/vendor/react-dom-factories.js");

const defaultProps = {
  disabled: false,
  busy: false,
  title: null,
  children: null,
  className: "",
};

/**
 * Button component that handles keyboard in an accessible way. When user
 * uses the mouse to hover/click on the button, there is no focus
 * highlighting. However if the user uses a keyboard to focus on the button,
 * it will have focus highlighting in the form of an outline.
 */
class Button extends Component {
  static get propTypes() {
    return {
      disabled: PropTypes.bool,
      busy: PropTypes.bool,
      title: PropTypes.string,
      children: PropTypes.string,
      className: PropTypes.string,
    };
  }

  static get defaultProps() {
    return defaultProps;
  }

  render() {
    const className = [
      ...this.props.className.split(" "),
      "devtools-button",
    ].join(" ");
    const props = Object.assign({}, this.props, {
      className,
      "aria-busy": this.props.busy.toString(),
      busy: this.props.busy.toString(),
    });

    const classList = ["btn-content"];
    if (this.props.busy) {
      classList.push("devtools-throbber");
    }

    return button(
      props,
      span(
        {
          className: classList.join(" "),
          tabIndex: -1,
        },
        this.props.children
      )
    );
  }
}

function ToggleButton(props) {
  const {
    active,
    busy,
    disabled,
    label,
    className,
    onClick,
    onKeyDown,
    tooltip,
  } = props;
  const classList = [...className.split(" "), "toggle-button"];

  if (active) {
    classList.push("checked");
  }

  if (busy) {
    classList.push("devtools-throbber");
  }

  return button(
    {
      disabled,
      "aria-pressed": active === true,
      "aria-busy": busy,
      className: classList.join(" "),
      onClick,
      onKeyDown,
      title: tooltip,
    },
    label
  );
}

module.exports = {
  Button,
  ToggleButton,
};
